2016-09-07 6 views
0

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을 사용하도록 강요하더라도 요청이 연결에 실패하는 이유는 무엇입니까?

+0

'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

+0

명시 적 URI가 추가되었습니다. – lebedov

+0

tls1은 어디에 설정합니까? 당신이하는 일은 ssl.PROTOCOL_TLSv1과 같은 변수 p를 만드는 것입니다. 아무 것도 설정하지 않습니다. 당신이해야 할 일은's.mount ('https : //', some_adapter))가없는 https://lukasa.co.uk/2013/01/Choosing_SSL_Version_In_Requests/입니다.'모든 코드 바를 제거 할 수도 있습니다 r = ... –

답변

0

이 문제는 인식 할 수없는 사용자 에이전트 문자열이있는 HTTP 헤더를 거부하는 프록시 때문인 것으로 판명되었습니다. 명시 적으로 헤더의 사용자 에이전트를 cntlm의 해킹 된 버전을 통해 Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)과 같은 것으로 설정하면 문제가 해결됩니다.