【发布时间】: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