我有一个非常特殊的问题。
特别是,我想检索以下网站的内容: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() 851C:\ 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')“,),))
有人可以帮助我了解如何使用请求模块对其进行修复吗?
预先感谢, 齐射
答案 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。