0 python ssl curl python-3.x 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)
Run Code Online (Sandbox Code Playgroud)
但我得到以下期望:
-------------------------------------------------- ------------------------- SysCallError Traceback (最近一次调用最后一次) C:\ProgramData\Anaconda3\lib\site-packages\urllib3\contrib\ pyopenssl.py in wrap_socket(self, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname) 440 try: --> 441 cnx.do_handshake() 442 除了 OpenSSL.SSL.WantReadError:
C:\ProgramData\Anaconda3\lib\site-packages\OpenSSL\SSL.py in do_handshake(self) 1906 result = _lib.SSL_do_handshake(self._ssl) -> 1907 self._raise_ssl_error(self._ssl, result) 1908
C:\ProgramData\Anaconda3\lib\site-packages\OpenSSL\SSL.py in _raise_ssl_error(self, ssl, result) 1631 raise SysCallError(errno, errorcode.get(errno)) -> 1632 raise SysCallError(-1, "意外的 EOF") 1633 否则:
SysCallError: (-1, '意外的 EOF')
在处理上述异常的过程中,又发生了一个异常:
SSLError Traceback(最近一次调用最后一次)C:\ProgramData\Anaconda3\lib\site-packages\urllib3\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn , chunked, body_pos, **response_kw) 600 body=body, headers=headers, --> 601 chunked=chunked) 602
C:\ProgramData\Anaconda3\lib\site-packages\urllib3\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw) 345 try: --> 346 self._validate_conn(conn) 347 除了 (SocketTimeout, BaseSSLError) 作为 e:
C:\ProgramData\Anaconda3\lib\site-packages\urllib3\connectionpool.py in _validate_conn(self, conn) 849 if not getattr(conn, 'sock', None): # AppEngine 可能没有
.sock--> 850 conn。第 851 章C:\ProgramData\Anaconda3\lib\site-packages\urllib3\connection.py in connect(self) 325 server_hostname=hostname, --> 326 ssl_context=context) 327
C:\ProgramData\Anaconda3\lib\site-packages\urllib3\util\ssl_.py in ssl_wrap_socket(sock, keyfile, certfile, cert_reqs, ca_certs, server_hostname, ssl_version, ciphers, ssl_context, ca_cert_dir) 328 HAS_SNI:#Platform具体:启用 SNI 的 OpenSSL --> 329 返回 context.wrap_socket(sock, server_hostname=server_hostname) 330
C:\ProgramData\Anaconda3\lib\site-packages\urllib3\contrib\pyopenssl.py in wrap_socket(self、sock、server_side、do_handshake_on_connect、suppress_ragged_eofs、server_hostname) 447 除外 OpenSSL.SSL.Error as e: --> 448 raise ssl.SSLError('坏握手:%r'%e) 449 中断
SSLError: ("握手错误:SysCallError(-1, 'Unexpected EOF')",)
在处理上述异常的过程中,又发生了一个异常:
MaxRetryError Traceback(最近一次调用最后一次)C:\ProgramData\Anaconda3\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies) 439 retries=self.max_retries, --> 440 超时=超时 441 )
C:\ProgramData\Anaconda3\lib\site-packages\urllib3\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw ) 638 重试 = retries.increment(method, url, error=e, _pool=self, --> 639 _stacktrace=sys.exc_info()[2]) 640 retries.sleep()
C:\ProgramData\Anaconda3\lib\site-packages\urllib3\util\retry.py in increment(self, method, url, response, error, _pool, _stacktrace) 387 if new_retry.is_exhausted(): --> 388 raise MaxRetryError(_pool, url, error or ResponseError(cause)) 389
MaxRetryError: HTTPSConnectionPool(host='www.mycardtamoil.it', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError("bad handshake: SysCallError(-1, 'Unexpected EOF')",) ,))
在处理上述异常的过程中,又发生了一个异常:
SSLError Traceback (最近一次调用最后一次) in () 1 import requests ----> 2 response = 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 return request(' get', url, params=params, **kwargs) 73 74
C:\ProgramData\Anaconda3\lib\site-packages\requests\api.py 在 request(method, url, **kwargs) 56 # 情况下,在其他情况下看起来像内存泄漏。57 使用 session.Session() 作为会话:---> 58 返回 session.request(method=method, url=url, **kwargs) 59 60
C:\ProgramData\Anaconda3\lib\site-packages\requests\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify , cert, json) 506 } 507 send_kwargs.update(settings) --> 508 resp = self.send(prep, **send_kwargs) 509 510 return resp
C:\ProgramData\Anaconda3\lib\site-packages\requests\sessions.py in send(self, request, **kwargs) 616 617 # 发送请求 --> 618 r = adapter.send(request, **kwargs ) 619 620 # 请求的总经过时间(大约)
C:\ProgramData\Anaconda3\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies) 504 if isinstance(e.reason, _SSLError): 505 #这个分支适用于 urllib3 v1.22 及更高版本。--> 506 引发 SSLError(e, request=request) 507 508 raise ConnectionError(e, request=request)
SSLError: HTTPSConnectionPool(host='www.mycardtamoil.it', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError("bad handshake: SysCallError(-1, 'Unexpected EOF')",) ,))
有人可以帮助我了解如何使用请求模块修复它吗?
提前致谢,萨尔沃
根据SSLLabs 的说法,服务器的设置很糟糕。值得注意的是,它只支持 TLS 1.0 及更低版本(甚至是或多或少损坏的 SSLv3 和绝对损坏的 SSLv2),并且它也只支持被认为很弱或非常不安全的密码。
虽然客户端通常支持 TLS 1.0(尽管存在已知问题,但仍被认为足够安全),但它们通常不支持弱和不安全的密码——至少在默认情况下,但有时它们甚至不再被编译。服务器支持的不太安全的密码可能是 TLS_RSA_WITH_3DES_EDE_CBC_SHA(在 OpenSSL 中称为 DES-CBC3-SHA)。
假设这个密码在你的 Python 使用的 OpenSSL 版本中仍然可用,你可以破解请求来启用这个密码。基于这个问题,可以这样做:
import requests
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'DES-CBC3-SHA'
requests.get('https://www.mycardtamoil.it/')
Run Code Online (Sandbox Code Playgroud)
虽然它现在不再得到一个Unexpected EOF它得到另一个错误:certificate verify failed。这是因为服务器设置不仅在协议版本和密码方面被破坏,而且证书没有正确配置。该SSLLabs报告的所有其他问题也跻身节目
此服务器的证书链不完整。
添加verify=False像你这样“修复”,加入更多的不安全问题,即它跳过证书的验证。请参阅此处了解如何正确修复此类情况。虽然,在您必须处理严重损坏和不安全的系统的情况下,正确检查证书是否真的会显着提高安全性尚不清楚。我建议不要向这个系统发送任何敏感数据,无论是否使用 HTTPS。
| 归档时间: |
|
| 查看次数: |
8650 次 |
| 最近记录: |