无法验证服务器SSL证书

时间:2015-04-17 13:49:18

标签: c openssl ssl-certificate pem

我正在尝试使用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客户端在arm设备上运行,该设备具有libssl v0.9.8。在嵌入式设备上运行的openssl工具产生与C应用程序相同的结果:第一个服务器的错误20和另一个服务器的错误。使用linux环境,openssl工具可以为两个服务器提供OK,但是,也许C应用程序的版本也会这样做。

1 个答案:

答案 0 :(得分:0)

经过一些试错后,我设法找到了问题。

我需要在“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