簡體   English   中英

代理后面的https GET使用wget + TLSv1成功,但是即使ssl協議被強制使用TLSv1,但請求失敗

[英]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.

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