10

我在我的 C 应用程序中使用 libcurl 与我设置的 HTTPS 服务器进行通信。我在该服务器上生成了一个我希望与 curl 一起使用的自签名证书。

我知道将 CURLOPT_SSL_VERIFYPEER 设置为 0 以绕过 SSL 验证,但我希望将生成的证书添加到 curl 的“有效”CA 证书中。

我尝试将 CURLOPT_CAPATH 和 CURLOPT_SSLCERT 设置为服务器 SSL 公钥的位置,但它未能通过验证。

如何添加我自己的 CA/自签名证书,以便 libcurl 成功验证它?

4

2 回答 2

4

要添加自签名证书,请使用CURLOPT_CAINFO

要检索站点的 SSL 公共证书,请使用

openssl s_client -connect www.site.com:443 | tee logfile

证书是用----BEGIN CERTIFICATE----和标记的部分
---END CERTIFICATE----

将该证书保存到文件中,并以如下方式使用 curl:

CURL* c = curl_easy_init();
curl_easy_setopt(c, CURLOPT_URL, "https://www.site.com");
curl_easy_setopt(c, CURLOPT_CAINFO, "/path/to/the/certificate.crt");
curl_easy_setopt(c, CURLOPT_SSL_VERIFYPEER, 1);
curl_easy_perform(c);
curl_easy_cleanup(c);
于 2014-07-08T18:38:36.143 回答
0

首先,您将“证书颁发机构”文件和“证书”文件混在一起,这让我感到困惑。

如何添加我自己的 CA/自签名证书,以便 libcurl 成功验证它?

这可能被视为对上述问题的补充答案。如果您要添加自签名 CA(每个根 CA 都是自签名的),以便 libcurl 成功验证由 CA 生成的网站证书,然后继续阅读。

使用 CURLOPT_CAINFO,您需要传递在生成要验证的站点的(非 CA)证书时使用的“证书颁发机构”文件 (CA)。

(我不知道这个选项是否通过传递非 CA 证书来工作,文档对此并不十分清楚,之前的答案有 2 个赞成票,所以如果有人测试过,请发表评论)

您还可以传递包含使用的 CA 的证书颁发机构链文件,以防它不是根 CA。

这是我发现的一个小教程,可以帮助您测试您的解决方案:

创建私有根 CA: http ://www.flatmtn.com/article/setting-openssl-create-certificates

创建站点证书: http ://www.flatmtn.com/article/setting-ssl-certificates-apache

于 2016-05-16T07:52:17.220 回答