Spa*_*ott 6 ssl openssl certificate
我正在编写一个非常基本的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");
}
Run Code Online (Sandbox Code Playgroud)
在那之后,通常的东西连接和沟通:
BIO_set_conn_hostname(bio, "www.google.com:https");
Run Code Online (Sandbox Code Playgroud)
加载或连接时不会出错.
但是,验证不起作用.
result = SSL_get_verify_result(ssl);
printf("The Verify Result is %d \n",result);
Run Code Online (Sandbox Code Playgroud)
我得到了回报UNABLE_TO_GET_ISSUER_CERT_LOCALLY (error code 20)
.
那么,我在这里错过了一些概念吗?这不会给我X509_V_OK
结果,因为它有可靠的证书吗?google.com上只有两个链接,我使用它们.
第二次调用SSL_CTX_load_verify_locations
是替换第一次调用中的证书。
您应该将根合并到一个文件中:
$ cat my-trusted-roots.pem
-----BEGIN CERTIFICATE-----
... (CA certificate in base64 encoding) ...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... (CA certificate in base64 encoding) ...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... (CA certificate in base64 encoding) ...
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)
然后加载该单个文件SSL_CTX_load_verify_locations
。请参阅上的SSL_CTX_load_verify_locations
OpenSSL文档。特别是,注释部分:
如果CAfile不为NULL,则它指向PEM格式的CA证书文件。该文件可以包含多个由以下标识的 CA 证书
-----开始证书-----
...(base64 编码的 CA 证书)...
-----证书结束-----
序列。允许在证书之前、之间和之后使用文本,这些文本可用于例如证书的描述。
这里只是自行车脱落...
result = SSL_get_verify_result(ssl);
printf("The Verify Result is %d \n",result);
Run Code Online (Sandbox Code Playgroud)
这是您需要执行的三项测试之一。
您需要执行的第二个测试如下。匿名 Diffie-Hellman (ADH) 不使用证书,因此您需要检查该证书。
X509* cert = SSL_get_peer_certificate(ssl);
if(cert) X509_free(cert);
if(cert == NULL)
/* Error - Anonymous Diffie-Hellman */
Run Code Online (Sandbox Code Playgroud)
SSL_get_peer_certificate
会增加证书上的引用计数,因此您需要对 进行匹配的调用X509_free
。
您需要执行的第三个测试是主机名匹配。OpenSSL 1.1.0将执行主机名匹配(以及其他名称匹配,例如 PKCS9 电子邮件地址);但较小的版本,如 0.9.8 和 1.0.1,不执行匹配。
归档时间: |
|
查看次数: |
4622 次 |
最近记录: |