![](/img/trans.png)
[英]Python HTTPS/SSL error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
[英]https GET behind proxy succeeds with wget + TLSv1, but fails with requests even if ssl protocol is forced to TLSv1
我正在嘗試通過代理服務器在MacOS 10.11.6上使用Python 2.7.12和OpenSSL 1.0.2h(均從Anaconda安裝)的請求2.11.1通過https獲取文件。 根據SSLLabs的說法 ,該服務器支持TLS 1.0、1.1和1.2。 此外,如果我將安全協議顯式設置為tlsv1(但如果將其設置為不支持的協議,如sslv2),則可以使用wget(鏈接到OpenSSL 1.0.2h)成功檢索文件。 但是,如果我嘗試將請求所使用的安全協議顯式設置為TLSv1,TLSv1_1或TLSv1_2,例如,如下所示,
from requests_toolbelt import SSLAdapter
import requests
import ssl
s = requests.Session()
p = ssl.PROTOCOL_TLSv1
s.mount('https://', SSLAdapter(p))
r = s.get("https://anaconda.org/conda-forge/matplotlib/2.0.0b3/download/osx-64/matplotlib-2.0.0b3-np111py27_5.tar.bz2")
我遇到以下異常:
/Users/lebedov/anaconda2/lib/python2.7/site-packages/requests/adapters.pyc in send(self, request, stream, timeout, verify, cert, proxies)
495 except (_SSLError, _HTTPError) as e:
496 if isinstance(e, _SSLError):
--> 497 raise SSLError(e, request=request)
498 elif isinstance(e, ReadTimeoutError):
499 raise ReadTimeout(e, request=request)
SSLError: ("bad handshake: Error([('SSL routines', 'SSL3_GET_RECORD', 'wrong version number')],)",)
(令人驚訝的是,將協議顯式設置為SSLv2,SSLv3或SSLv23也會導致握手異常。)此外,在嘗試通過https獲取其他站點時,我也沒有觀察到任何異常。 知道為什么即使我強制使用TLSv1時,連接也會因請求而失敗?
事實證明,此問題是由於代理拒絕帶有無法識別的用戶代理字符串的HTTP標頭所致。 通過黑客入侵的cntlm版本將標頭中的用戶代理明確設置為Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)
,即可解決該問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.