解決Curl下載https地址文件出錯的問題


問題描述

使用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上不建議使用該選項。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM