问题描述
使用curl下载https地址文件时,调用
curl_easy_perform
函数返回错误码60,表示
CURL_SSL_CACERT
错误,大概的意思是没有设置证书。当前使用的 curl版本为:
libcurl/7.28.1 OpenSSL/1.0.1u zlib/1.2.2
。
浏览器在访问https站点,会通过内置的信任根证书来验证服务器有效性。具体验证方法有:
-
查看证书的颁发者是否受信任
-
验证证书是否吊销(下载已吊销证书列表对比或实时验证)
-
验证证书是否在有效期
-
验证服务端是否是该证书的持有者。
curl
在访问
https
地址时,默认会开启有效性验证,具体有验证服务器证书真实性以及服务器是否是该证书的持有者。
验证服务器证书真实性
此项验证,由
CURLOPT_SSL_VERIFYPEER
选项控制,设置
1
表示开启验证,
0
表示关闭验证。
curl
使用默认
CA
证书列表(证书搜索路径由编译时决定),可通过
CURLOPT_CAINFO
或者
CURLOPT_CAPATH
选项更改受信任根证书路径。
验证服务器是否是该证书持有者
此项验证,由
CURLOPT_SSL_VERIFYHOST
选项控制,该选项有以下几种取值:
-
0:忽略证书认证
-
1:7.28.1版本的,设为1不会改变该标志。 7.66.0版本,1与2效果一样。
-
2:对端服务器必须是证书的持有者。具体通过证书中的
Common Name field
或者
Subject Alternate Name field
,来验证请求url中的域名是否有效。(默认值)
问题解决
根据上述的分析,有如下几种解决方案:
方案一:关闭
curl
下载
https
文件的安全验证。具体方法如下:
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
方案二:开启验证,并指明验证依赖的
CA
证书路径。
下载证书有效性校验文件,
下载地址点此进
,下载完成后,将该文件放在程序所在目录,然后添加如下
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1L);
curl_easy_setopt(hCurl, CURLOPT_SSL_VERIFYPEER, 1L);