簡體   English   中英

Python 請求獲取 SSLerror

[英]Python Requests getting SSLerror

嘗試使用請求 session 發出簡單的獲取請求,但我不斷收到特定站點的 SSLerror。 我認為問題可能出在網站上(我使用https://www.ssllabs.com進行了掃描,結果如下所示),但我不能確定,因為我對這方面一無所知:) 我肯定會喜歡了解發生了什么。

解決方案/解釋會很棒,謝謝!

代碼:

import requests

requests.get('https://www.reporo.com/')

我收到下一個錯誤:

SSLError: [Errno bad handshake] [('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')]

---------------------------------------------------------------------------
SSLError                                  Traceback (most recent call last)
<ipython-input-7-cfc21b287fee> in <module>()
----> 1 requests.get('https://www.reporo.com/')

/usr/local/lib/python2.7/dist-packages/requests/api.pyc in get(url, **kwargs)
     63 
     64     kwargs.setdefault('allow_redirects', True)
---> 65     return request('get', url, **kwargs)
     66 
     67 

/usr/local/lib/python2.7/dist-packages/requests/api.pyc in request(method, url, **kwargs)
     47 
     48     session = sessions.Session()
---> 49     response = session.request(method=method, url=url, **kwargs)
     50     # By explicitly closing the session, we avoid leaving sockets open which
     51     # can trigger a ResourceWarning in some cases, and look like a memory leak

/usr/local/lib/python2.7/dist-packages/requests/sessions.pyc in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    459         }
    460         send_kwargs.update(settings)
--> 461         resp = self.send(prep, **send_kwargs)
    462 
    463         return resp

/usr/local/lib/python2.7/dist-packages/requests/sessions.pyc in send(self, request, **kwargs)
    571 
    572         # Send the request
--> 573         r = adapter.send(request, **kwargs)
    574 
    575         # Total elapsed time of the request (approximately)

/usr/local/lib/python2.7/dist-packages/requests/adapters.pyc in send(self, request, stream, timeout, verify, cert, proxies)
    429         except (_SSLError, _HTTPError) as e:
    430             if isinstance(e, _SSLError):
--> 431                 raise SSLError(e, request=request)
    432             elif isinstance(e, ReadTimeoutError):
    433                 raise ReadTimeout(e, request=request)

SSLError: [Errno bad handshake] [('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')]

我在https://www.ssllabs.com進行了掃描,得到了以下信息:

SSL Report: reporo.com
Assessed on:  Sun Feb 22 21:42:57 PST 2015 | Clear cache Scan Another >>

    Server  Domain(s)   Test time   Grade
1   154.51.128.13 
Certificate not valid for domain name 
reporo.com
Sun Feb 22 21:40:53 PST 2015 
Duration: 9.167 sec -
2   198.12.15.168 
protected.ddosdefend.com 
Ready 
www.reporo.com

Sun Feb 22 21:41:02 PST 2015 
Duration: 115.189 sec   
F

www.reporo.com(不是 reporo.com)的證書本身是有效的,但它缺少鏈證書,如ssllabs的報告所示:

Chain issues    Incomplete
....
2   Extra download  Thawte DV SSL CA 
Fingerprint: 3ca958f3e7d6837e1c1acf8b0f6a2e6d487d6762 

“不完整”和“額外下載”是重點。 一些瀏覽器會緩存丟失的鏈證書,其他瀏覽器會下載,而其他瀏覽器會失敗。 如果您使用新的 Firefox 配置文件(沒有緩存任何證書)嘗試該站點,它也會失敗。

您可以下載缺少的鏈證書並將其用作受信任的 CA 證書,並帶有請求的verify參數。 不要只是禁用驗證,因為那樣你很容易受到中間人攻擊。

分步說明:

您可以禁用證書驗證:

requests.get('https://www.reporo.com/', verify=False)

但是沒有證書驗證就沒有中間人攻擊保護。

我有同樣的錯誤。 將請求從 requests-2.17.3 降級到 requests-2.11.0 為我解決了這個問題。

pip uninstall requests
pip install requests==2.11.0

遇到類似問題並通過以下方式修復:

pip install -U requests[security]

當網站具有由瀏覽器確定的有效證書但服務器未提供完整的證書鏈時,Steffen Ullrich 給出了最佳答案。

有時只是缺少根證書或中間證書,並且瀏覽器可以即時下載或驗證缺少的證書,但是使用請求模塊,您將手動驗證它。 我使用SSL 實驗室將完整的證書鏈確定為 .pem 文件。 輸入感興趣的網址,等待測試完成。 然后導航到並展開“認證路徑”。 可能有多個受信任的路徑(或沒有,在這種情況下最終請求將不會成功),在右側您將看到一個下載鏈按鈕。

將整個鏈復制為文本並將其另存為 .pem 文件。 然后在發出請求時將此 .pem 文件的路徑傳遞給 requests 函數:

r = requests.get(url, verify= "path/to/chain.pem")

使用 MimT 時也會出現此錯誤。

您可以使用requests.get('https://github.com', verify='/path/to/certfile')信任您的 CA,或將其路徑設置為REQUESTS_CA_BUNDLE環境變量。

參考: https://docs.python-requests.org/en/master/user/advanced/#ssl-cert-verification

暫無
暫無

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

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