【问题标题】:Can not validate the server SSL certificate无法验证服务器 SSL 证书
【发布时间】:2015-06-24 10:02:46
【问题描述】:

我正在尝试使用 openssl 库让客户端通过 https 连接到某些服务器。

调用栈是这样的:

SSL_library_init();
SSL_load_error_strings();
SSL_CTX *ctx = SSL_CTX_new(TLSv1_method());
SSL_CTX_load_verify_locations(ctx, "file_with_trusted_certificates", NULL);
SSL *ssl = SSL_new(ctx);
BIO *bio = BIO_new_socket(...);
SSL_set_bio(ssl, bio, bio);

SSL_connect(ssl);

SSL_get_verify_result(ssl);

我有 2 台带有 ssl 证书的服务器,我使用 openssl 工具提取并放入“file_with_trusted_certificates”文件:

openssl s_client -showcerts -connect server_url:443

问题如下:验证了一台服务器(尽管如果不使用 file_with_trusted_certificates 失败,错误 19:证书链中的自签名证书),但第二台服务器的检查总是失败,错误 20:无法获取本地颁发者证书。路过时

"-CAfile file_with_trusted_certificates"

到 openssl 工具,两台服务器都得到验证。

我做错了什么,为什么第二个服务器也没有得到验证?

服务器具有不同的密码,成功的服务器启用了安全重新协商。

编辑:

C 客户端在具有 libssl v0.9.8 的 arm 设备上运行。在嵌入式设备上运行的 openssl 工具产生与 C 应用程序相同的结果:第一个服务器的错误 20 和另一个服务器的 OK。使用 linux 环境,openssl 工具对两个服务器都可以,但是,也许 C 应用程序的版本会这样做。

【问题讨论】:

  • 两台服务器的openssl版本相同?
  • @vathek,看来使用的协议是 TLSv1,我也尝试设置 SSL_OP_CIPHER_SERVER_PREFERENCE 标志,但无济于事
  • 将第二个证书导入 file_with_trusted_certificates 返回一些警告?
  • @vathek,我以不同的方式(浏览器导出、openssl 工具)生成了 file_with_trusted_certificates,它只包含多个以 base64 编码的 pem 证书,我从未收到任何警告,我检查了证书没有损坏使用一些在线工具。
  • 你的意思是说 s_client,两台服务器都产生验证码 0(OK)但是用你的 C 代码,一个是 OK 但另一个错误 20?

标签: c openssl ssl-certificate pem


【解决方案1】:

经过几次试错,我终于找到了问题所在。

我需要在“file_with_trusted_certificates”文件的链中添加根证书颁发者的证书,但我只在链中添加了根证书:

Common name: Baltimore CyberTrust Root -> I added this
Issuer: GTE CyberTrust Global Root -> I needed to add the certificate of this

有趣的是,它正在为其他服务器工作,因为链中的根证书是自签名和授权的:

Common name: AddTrust External CA Root
Issuer: AddTrust External CA Root

【讨论】:

    猜你喜欢
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 2010-09-09
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    相关资源
    最近更新 更多