簡體   English   中英

SSL:CERTIFICATE_VERIFY_FAILED 證書驗證在 Python 中失敗

[英]SSL: CERTIFICATE_VERIFY_FAILED certificate verify failed in Python

在用 Python 編寫 POST REQUEST 時,我遇到了一些問題:

self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1108)

我不想在請求中設置: verify = False

我該如何處理這個問題?

發生錯誤是因為服務器使用的證書不是由requests模塊使用的受信任 CA 的默認列表中包含的證書頒發機構 (CA) 頒發的。 它是一個自簽名證書,因此您要么需要明確告訴requests信任該個人證書,要么(最好,如果服務器在您的控制之下),獲得由受信任的 CA 之一簽名的證書並讓服務器使用那個。

要僅信任服務器使用的確切證書,請下載它,而不是設置verify=False ,設置verify="/path/to/cert.pem" ,其中cert.pem是服務器證書。

以下是有關創建正確 .pem 文件的一些更詳細的說明:

以下 URL包含使用各種瀏覽器從網站下載 SSL 證書的說明。 您需要創建一個證書鏈.pem文件,為此您需要使用 Firefox。 我們會假設 google.com 是您遇到問題的網站。 當您進入證書頁面時,您將看到類似以下內容:

在此處輸入圖片說明

在本例中,您可以選擇 GTS CA 101 或 GlobalSIGN,然后單擊PEM (chain)下載鏈接。 這將在您選擇的目錄中創建一個文件google-com-chain.pem

然后在源指定的任何地方verify=False ,將其替換為 `verify='/path-to/google-com-chain.pem'

進口請求
response = requests.get("你要點擊的url/api", verify="ssl證書的路徑")

對我來說,問題是上述答案都沒有完全幫助我,但給了我正確的方向。

當然,需要 SSL 證書,但是當您位於公司的防火牆后面時,公開可用的證書可能無濟於事 您可能需要聯系您公司的 IT 部門以獲取證書,因為每家公司都使用與他們簽訂服務合同的安全提供商提供的特殊證書 並將其放在一個文件夾中,並將該文件夾的路徑作為參數傳遞給驗證參數。

對我來說,即使在嘗試了上述所有解決方案並使用了錯誤的證書后,我也無法使其正常工作。 所以請記住,那些在公司防火牆后面的人要獲得正確的證書。 它可以在您的請求調用的成功和失敗之間產生差異。

在我的情況下,我將證書放在以下路徑中,它就像魔術一樣工作。

C:\\Program Files\\Common Files\\ssl

您還可以參考https://2.python-requests.org/en/master/user/advanced/#id3 ,其中討論了 ssl 驗證

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM