Python 2.7.12およびOpenSSL 1.0.2hのリクエスト2.11.1を使用してhttps経由でファイルを取得しようとしています。 (すべてAnacondaからMacOS 10.11.6にインストールされています) SSLLabsによれば、サーバーはTLS 1.0,1.1、および1.2をサポートしています。さらに、secure-protocolをtlsv1に明示的に設定すると、wget(OpenSSL 1.0.2hにリンクされています)でファイルを正常に取得できます(ただし、sslv2などのサポートされていないプロトコルに設定した場合は無効になります)。しかし、私は次のように明示的に、私は次の例外に遭遇https GETプロキシの後ろはwget + TLSv1で成功しますが、sslプロトコルがTLSv1に強制されていてもリクエストで失敗します
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")
などのTLSv1、TLSv1_1、またはTLSv1_2、への要求が使用するセキュアなプロトコルを設定しようとした場合:
/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を使用するように強制しても、要求が接続に失敗する理由は何ですか?
'https:// myurl ...'はあまり役に立ちません。 SNIは違いを生みますか? SNIなし: 'openssl s_client -connect: -tls1'。 SNIの場合: 'openssl s_client -connect : -tls1 -servername 'です。また、[SSLv3 alert handshake failure urllib2](http://stackoverflow.com/q/30918761)も参照してください。これはPython 2.7の質問です。 –
jww
明示的なURIが追加されました。 – lebedov
ここでtls1を設定していますか?あなたがしていることは、ssl.PROTOCOL_TLSv1に等しい変数pを作成することです。何も設定していません。あなたがしなければならないのは、 'https://lukasa.co.uk/2013/01/Choosing_SSL_Version_In_Requests/ 'であり、' s.mount(' https:// '、some_adapter)) 'なしで'すべてのコードバーr = ... –