为libcurl添加自签名SSL证书

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

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

我已尝试将CURLOPT_CAPATH和CURLOPT_SSLCERT设置为服务器SSL公钥的位置,但无法通过validation。

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

要添加自签名证书,请使用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); 

首先,你混淆了“证书颁发机构”文件和混淆了我的“证书”文件。

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

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

使用CURLOPT_CAINFO,您需要传递在生成要validation的站点的(非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