問題描述
使用curl下載https地址文件時,調用 curl_easy_perform
函數返回錯誤碼60,表示CURL_SSL_CACERT
錯誤,大概的意思是沒有設置證書。當前使用的 curl版本為:libcurl/7.28.1 OpenSSL/1.0.1u zlib/1.2.2
。
問題分析
按圖索驥,據此錯誤碼,可在網上搜索到如下文章:
curl_easy_perform gives error code CURLE_SSL_CACERT
使用CURL 返回錯誤碼:CURLE_SSL_CACERT,請問如何設置SA證書!
瀏覽器在訪問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);
curl_easy_setopt(hCurl, CURLOPT_CAINFO, ".\cacert.pem");
CURLOPT_CAINFO:指定證書文件全路徑,使用相對路徑即可。
CURLOPT_CAPATH:指定證書所在目錄,官方文檔里面說:The CURLOPT_CAPATH function apparently does not work in Windows due to some limitation in openssl
。在windows上不建議使用該選項。