【发布时间】:2014-08-10 12:26:30
【问题描述】:
我正在编写一个非常基本的 SSL 客户端来连接到 HTTPS Web 服务器。我可以很好地连接和处理请求/响应。然而 OpenSSL 报告了UNABLE_TO_GET_ISSUER_CERT_LOCALLY,但到目前为止我选择忽略错误:-)。现在我想解决这部分问题。
我正在通过 HTTPS 连接到公共 SSL 服务器(例如 Google 或 Yahoo)进行测试,并检查 SSL_get_verify_result(...) 的返回。
据我了解,我需要该特定站点的 CA pem 文件,以便 OpenSSL 可以将链验证到受信任的证书颁发机构。在这种情况下,这将是为 Google 或 Yahoo 签署证书的机构。
为了获得我期望的 PEM 文件,我打开了我的 FireFox,导航到这些站点,并执行了查看证书并将每个文件导出到列表中。例如,我有一个名为“GeoTrustGlobalCA.pem”的文件,看起来都不错。事实上,当我直接访问 GeoTrust 站点并下载他们的根证书时,它与我从 FireFox 导出的证书完全相同。
因此,例如,Google 在 FireFox 的树中显示了两个证书,我将每个证书加载为:
result = SSL_CTX_load_verify_locations(ctx,"GoogleInternetAuthorityG2.pem",NULL);
if (result == 0) {
puts("Opps... Can't load the certificate");
}
result = SSL_CTX_load_verify_locations(ctx,"GeoTrustGlobalCA.pem",NULL);
if (result == 0) {
puts("Opps... Can't load the certificate");
}
在那之后,通常的连接和交流的东西:
BIO_set_conn_hostname(bio, "www.google.com:https");
加载或连接时不会出错。
但是,验证不起作用。
result = SSL_get_verify_result(ssl);
printf("The Verify Result is %d \n",result);
我收到了返回UNABLE_TO_GET_ISSUER_CERT_LOCALLY (error code 20)。
那么,我在这里遗漏了一些概念吗?这不会给我X509_V_OK 结果,因为它具有受信任的证书吗?只有两个来自 google.com,我使用了它们。
【问题讨论】:
标签: ssl openssl certificate