curl 錯誤總結


證書域名與訪問的域名不一致

  • 問題:curl SSL: certificate subject name 'luffichen_server.tencent.com' does not match target host name '127.0.0.1'
  • 原因:這是因為 curl 訪問 https 服務器時,會驗證服務器證書的有效性和證書域名與訪問域名一致性
  • 解決方法:

(1) 修改 curl 選項,使其不驗證服務器證書

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, FALSE);

(2) 針對 curl 命令,-k 選項,也可以使其不驗證證書
(3) 保證證書域名與訪問的域名一致,因為訪問的是一個 IP,在 hosts 文件添加IP域名關系映射,然后使用服務器證書的域名進行訪問

  • 參考:
  1. https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html
  2. https://stackoverflow.com/questions/20842970/fix-curl-51-ssl-error-no-alternative-certificate-subject-name-matches

CA 證書不存在

  • 問題:curl: (60) SSL certificate : unable to get local issuer certificate
  • 原因:在驗證服務器證書時,CA 證書不存在
  • 解決方法:

因為你指定了要驗證服務器證書有效性,那么需要指定 CA 證書或者使用 curl 默認證書(https://curl.haxx.se/docs/caextract.html,haxx.se had a bundle of all sorts of CA certs,但不會有你服務器的自簽證書,這個需要自己指定了)

// 指定 CA 證書路徑
curl_easy_setopt(m_curl_handler, CURLOPT_CAINFO, m_ca_cert_file.c_str());
  • 參考:
  1. https://stackoverflow.com/questions/24611640/curl-60-ssl-certificate-unable-to-get-local-issuer-certificate
  2. https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html
  3. https://github.com/openssl/openssl/issues/2833
  4. https://my.oschina.net/lemonzone2010/blog/467213(未驗證)

CA 證書不正確

  • 問題: ssl peer certificate or ssh remote key was not ok
  • 原因:在驗證服務器證書時,CA 證書不正確,比如使用錯了證書

無法設置私鑰

  • 問題:curl: (58) unable to set private key file
  • 原因:錯誤的原因有很多,當時我的私鑰是帶密私鑰,密碼輸錯了,導致后面的驗證失敗

訪問 HTTPS 服務器報SSL_ERROR_SYSCALL

  • 問題:curl -k 一個 https 服務器時,發現 curl 連接失敗,並返回 curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to 127.0.0.1:39000
  • 原因:錯誤原因可能很多,我這里curl 已經帶上 -k 選項,客戶端不驗服務器證書了,后來發現是因為服務器側的問題導致的,未設置服務器私鑰
  • 解決方法:
httpd.socket = ssl.wrap_socket (httpd.socket, certfile=CERTFILE,keyfile=KEYFILE, server_side=True)
# 問題代碼: httpd.socket = ssl.wrap_socket (httpd.socket, certfile=CERTFILE, server_side=True)

SSL certificate problem, verify that the CA cert is OK

CURLOPT_SSL_VERIFYPEER 為 1 時,表示啟用了驗證訪問的服務器合法性,且必須設置 CURLOPT_CAINFOCURLOPT_CAPATH 其中一個,而 CURLOPT_SSL_VERIFYHOST 為 2 時,表示驗證 CA 證書中的 common name 是否與訪問的服務器域名是否一致。在測試的時候,需要記得為客戶端側機器添加相應的 host 域名 IP 解析,如果直接使用 IP 訪問也會報 SSL certificate problem, verify that the CA cert is OK 錯誤。

curl: (60) SSL certificate : unable to get local issuer certificate

問題的原因有很多,這里只列舉一二。

在驗證服務器證書時,找不到CA證書,如果正確設置了 cainfo 或 capath 參數且 CA 證書已經是 rootCA,依然出錯,那么可能是證書生成的時候出錯,再重新生成一個;如果 CA 證書由一個中間證書簽發,rootCA 簽發中間證書,那么如果服務器沒有提供中間證書,在驗證過程中,openssl 在形成完整的證書鏈也會報這個錯誤,所以 cat intermediate.crt >> domain.crt 將所有中間證書與rootCA證書捆綁在一起。


免責聲明!

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



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