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를 지원합니다. 또한 보안 프로토콜을 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 '. 또한 Python 2.7 질문 인 [urlib2로 SSLv3 경고 핸드 셰이크 실패] (http://stackoverflow.com/q/30918761)를 참조하십시오. –
jww
명시 적 URI가 추가되었습니다. – lebedov
tls1은 어디에 설정합니까? 당신이하는 일은 ssl.PROTOCOL_TLSv1과 같은 변수 p를 만드는 것입니다. 아무 것도 설정하지 않습니다. 당신이해야 할 일은's.mount ('https : //', some_adapter))가없는 https://lukasa.co.uk/2013/01/Choosing_SSL_Version_In_Requests/입니다.'모든 코드 바를 제거 할 수도 있습니다 r = ... –