Python SSL错误握手

时间:2018-11-05 16:18:23

标签: python python-3.x ssl curl python-requests

我有一个非常特殊的问题。 特别是,我想检索以下网站的内容:https://www.mycardtamoil.it/

据我了解,该网站的SSL证书存在一些问题。如果您在Chrome中打开它,就没有问题,但是如果您尝试通过cURL(curl https://www.mycardtamoil.it/)检索内容,则会收到ssl错误,该错误可以通过使用选项-k

绕过

当我转向Python3时,我无法绕过此问题;我测试过的代码是:

import requests
response = requests.get('https://www.mycardtamoil.it/', verify=False)

但是我有以下期望:

  

-------------------------------------------------- ---------------------------- SysCallError Traceback(最近的呼叫   持续)   C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ urllib3 \ contrib \ pyopenssl.py   在wrap_socket(自我,袜子,server_side,do_handshake_on_connect,   prevent_ragged_eofs,服务器主机名)       440尝试:   -> 441 cnx.do_handshake()       442除了OpenSSL.SSL.WantReadError:

     

C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ OpenSSL \ SSL.py在   do_handshake(self)1906结果=   _lib.SSL_do_handshake(self._ssl)   -> 1907 self._raise_ssl_error(self._ssl,结果)1908

     

C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ OpenSSL \ SSL.py在   _raise_ssl_error(self,ssl,result)1631引发SysCallError(errno,errorcode.get(errno))   -> 1632提高SysCallError(-1,“意外的EOF”)1633其他:

     

SysCallError:(-1,“意外的EOF”)

     

在处理上述异常期间,发生了另一个异常:

     

SSLError跟踪(最近的呼叫)   持续)   C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ urllib3 \ connectionpool.py   在urlopen(self,method,url,body,标头,重试,重定向,   assert_same_host,超时,pool_timeout,release_conn,分块,   body_pos,** response_kw)       600正文=正文,标题=标题,   -> 601分块=分块)       602

     

C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ urllib3 \ connectionpool.py   在_make_request中(自我,conn,方法,url,超时,分块,   ** httplib_request_kw)       345尝试:   -> 346 self._validate_conn(conn)       347除了(SocketTimeout,BaseSSLError)为e:

     

C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ urllib3 \ connectionpool.py   在_validate_conn(self,conn)中       849(如果没有)getattr(conn,'sock',None):#AppEngine可能没有.sock   -> 850 conn.connect()       851

     

C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ urllib3 \ connection.py在   连接(个体)       325 server_hostname =主机名,   -> 326 ssl_context = context)       327

     

C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ urllib3 \ util \ ssl_.py在   ssl_wrap_socket(袜子,密钥文件,certfile,cert_reqs,ca_certs,   server_hostname,ssl_version,密码,ssl_context,ca_cert_dir)       328 if HAS_SNI:#特定于平台:具有启用的SNI的OpenSSL   -> 329返回context.wrap_socket(sock,server_hostname = server_hostname)       330

     

C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ urllib3 \ contrib \ pyopenssl.py   在wrap_socket(自我,袜子,server_side,do_handshake_on_connect,   prevent_ragged_eofs,服务器主机名)       447除了OpenSSL.SSL.Error为e:   -> 448提高ssl.SSLError('握手不好:%r'%e)       449休息

     

SSLError :(“握手不正确:SysCallError(-1,'意外的EOF')”,)

     

在处理上述异常期间,发生了另一个异常:

     

MaxRetryError Traceback(最近的呼叫   最后)C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ requests \ adapters.py   发送中(自己,请求,流,超时,验证,证书,代理)       439次retries = self.max_retries,   -> 440超时=超时       441)

     

C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ urllib3 \ connectionpool.py   在urlopen(self,method,url,body,标头,重试,重定向,   assert_same_host,超时,pool_timeout,release_conn,分块,   body_pos,** response_kw)       638重试= retries.increment(方法,网址,错误= e,_pool =自我,   -> 639 _stacktrace = sys.exc_info()[2])       640重试.sleep()

     

C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ urllib3 \ util \ retry.py在   增量(自身,方法,URL,响应,错误,_pool,_stacktrace)       第387章(一更)   -> 388引发MaxRetryError(_pool,url,error或ResponseError(cause))       389

     

MaxRetryError:HTTPSConnectionPool(host ='www.mycardtamoil.it',   port = 443):超过最大重试次数的网址:/(由引起   SSLError(SSLError(“不好的握手:SysCallError(-1,'意外   EOF')“,),))

     

在处理上述异常期间,发生了另一个异常:

     

SSLError跟踪(最近的呼叫)   最后)在()         1进口要求   ----> 2个响应= requests.get('https://www.mycardtamoil.it/',verify = False)

     

C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ requests \ api.py in get(url,   params,** kwargs)        70        71 kwargs.setdefault('allow_redirects',True)   ---> 72个返回请求('get',url,params = params,** kwargs)        73        74

     

C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ requests \ api.py在   请求(方法,URL,** kwargs)        56#的情况下,看起来像其他人的内存泄漏。        57个带有session.Session()作为会话的会话:   ---> 58 return session.request(method = method,url = url,** kwargs)        59        60

     

C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ requests \ sessions.py在   请求(自身,方法,URL,参数,数据,标头,Cookie,文件,   身份验证,超时,allow_redirects,代理,挂钩,流,验证,证书,   json)       506}       507 send_kwargs.update(设置)   -> 508 resp = self.send(prep,** send_kwargs)       509       510返回响应

     

C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ requests \ sessions.py在   发送(自己,请求,**假)       616       617#发送请求   -> 618 r = adapter.send(请求,** kwargs)       619       620#请求的总经过时间(大约)

     

C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ requests \ adapters.py在   发送(自身,请求,流,超时,验证,证书,代理)       504 if isinstance(e.reason,_SSLError):       505#此分支适用于urllib3 v1.22及更高版本。   -> 506引发SSLError(e,request = request)       507       508引发ConnectionError(e,request = request)

     

SSLError:HTTPSConnectionPool(host ='www.mycardtamoil.it',port = 443):   URL超过最大重试次数:/(由SSLError(SSLError(“ bad   握手:SysCallError(-1,'意外的EOF')“,),))

有人可以帮助我了解如何使用请求模块对其进行修复吗?

预先感谢, 齐射

1 个答案:

答案 0 :(得分:3)

根据SSLLabs,服务器设置很糟糕。值得注意的是,它仅支持TLS 1.0及以下版本(甚至破损的SSLv3和绝对破损的SSLv2),并且还仅支持被认为是弱的或确实不安全的密码。

虽然客户端通常支持TLS 1.0(尽管存在已知问题,但仍被认为足够安全),但它们通常不支持弱密码和不安全密码-至少在默认情况下,但有时甚至不再进行编译。服务器支持的不太安全的密码可能是TLS_RSA_WITH_3DES_EDE_CBC_SHA(在OpenSSL中称为DES-CBC3-SHA)。

假设您的Python使用的OpenSSL版本中仍然可以使用此密码,则可以入侵请求以启用该密码。基于this question,可以这样操作:

import requests
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'DES-CBC3-SHA'
requests.get('https://www.mycardtamoil.it/')

虽然现在不再获得Unexpected EOF了,但它又遇到了另一个错误:certificate verify failed。这是因为服务器设置不仅在协议版本和密码方面被破坏,而且证书配置不正确。 SSLLabs report还显示了其他所有问题

  

此服务器的证书链不完整。

像添加verify=False一样,通过添加更多不安全性来“解决”该问题,即跳过了证书的验证。有关如何正确解决此类情况,请参见here。尽管目前尚不清楚,在这种情况下(必须处理严重损坏且不安全的系统),正确检查证书是否会真正显着提高安全性。我建议不要将任何敏感数据发送到该系统,无论是否使用HTTPS。