curl 錯誤總結

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

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

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

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

(2) 針對 curl 命令,-k 選項,也可使其不驗證證書git

(3) 保證證書域名與訪問的域名一致,由於訪問的是一個 IP,在 hosts 文件添加IP域名關係映射,而後使用服務器證書的域名進行訪問github

  • 參考:
  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 錯誤。dom

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

問題的緣由有不少,這裏只列舉一二。ssh

在驗證服務器證書時,找不到CA證書,若是正確設置了 cainfo 或 capath 參數且 CA 證書已是 rootCA,依然出錯,那麼多是證書生成的時候出錯,再從新生成一個;若是 CA 證書由一箇中間證書籤發,rootCA 簽發中間證書,那麼若是服務器沒有提供中間證書,在驗證過程當中,openssl 在造成完整的證書鏈也會報這個錯誤,因此 cat intermediate.crt >> domain.crt 將全部中間證書與rootCA證書捆綁在一塊兒。curl

相關文章
相關標籤/搜索