簡體   English   中英

Python SSL錯誤握手

[英]Python SSL Bad Handshake

我有一個非常特殊的問題。 特別是,我想檢索以下網站的內容: https://www.mycardtamoil.it/ : 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跟蹤(最近一次通話最近)C:\\ ProgramData \\ Anaconda3 \\ lib \\ site-packages \\ urllib3 \\ contrib \\ wrap_socket中的pyopenssl.py(self,sock,server_side,do_handshake_on_connect,suppress_ragged_eofs,server_hostname)440試試:-> 441 cnx.do_handshake()442除了OpenSSL.SSL.WantReadError:

C:\\ ProgramData \\ Anaconda3 \\ lib \\ site-packages \\ OpenSSL \\ SSL.py in 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 in _raise_ssl_error(self,ssl,result)1631引發SysCallError(errno,errorcode.get(errno))-> 1632引發SysCallError(-1,“意外的EOF”)1633其他:

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

在處理上述異常期間,發生了另一個異常:

SSLError Traceback(最近一次通話最近)C:\\ ProgramData \\ Anaconda3 \\ lib \\ site-packages \\ urllib3 \\ connectionpool.py in urlopen(自身,方法,URL,正文,標頭,重試,重定向,assert_same_host,超時,pool_timeout,release_conn ,chunked,body_pos,** response_kw)600 body = body,headers = headers,-> 601chunk = chunked)602

_make_request中的C:\\ ProgramData \\ Anaconda3 \\ lib \\ site-packages \\ urllib3 \\ connectionpool.py(self,conn,method,url,timeout,chunked,** httplib_request_kw)345嘗試:-> 346 self._validate_conn(conn) 347除了(SocketTimeout,BaseSSLError)如e:

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

C:\\ ProgramData \\ Anaconda3 \\ lib \\ site-packages \\ urllib3 \\ connection.py in connect(self)325 server_hostname = hostname,-> 326 ssl_context = context)327

ssl_wrap_socket中的C:\\ ProgramData \\ Anaconda3 \\ lib \\ site-packages \\ urllib3 \\ util \\ ssl_.py(sock,keyfile,certfile,cert_reqs,ca_certs,server_hostname,ssl_version,ciphers,ssl_context,ca_cert_dirNI)328#Platform-S特定:啟用了SNI的OpenSSL-> 329返回context.wrap_socket(sock,server_hostname = server_hostname)330

C:\\ ProgramData \\ Anaconda3 \\ lib \\ site-packages \\ urllib3 \\ contrib \\ pyopenssl.py在wrap_socket(self,sock,server_side,do_handshake_on_connect,injection_ragged_eofs,server_hostname)447中,但OpenSSL.SSL。錯誤為e:-> 448引發ssl.SSLError('握手錯誤:%r'%e)449中斷

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

在處理上述異常期間,發生了另一個異常:

MaxRetryError Traceback(最近一次通話最近)C:\\ ProgramData \\ Anaconda3 \\ lib \\ site-packages \\ requests \\ adapters.py in send(self,request,stream,timeout,verify,verify,cert,proxies)439 retries = self.max_retries -> 440超時=超時441)

urlopen中的C:\\ ProgramData \\ Anaconda3 \\ lib \\ site-packages \\ urllib3 \\ connectionpool.py(自身,方法,URL,正文,標頭,重試,重定向,assert_same_host,超時,pool_timeout,release_conn,分塊,body_pos,** response_kw )638重試= retries.increment(方法,URL,錯誤= e,_pool =自我,-> 639 _stacktrace = sys.exc_info()[2])640 retries.sleep()

C:\\ ProgramData \\ Anaconda3 \\ lib \\ site-packages \\ urllib3 \\ util \\ retry.py以增量(自身,方法,URL,響應,錯誤,_pool,_stacktrace)387如果new_retry.is_exhausted():-> 388提高MaxRetryError(_pool,url,錯誤或ResponseError(原因))389

MaxRetryError:HTTPSConnectionPool(host ='www.mycardtamoil.it',端口= 443):url超過了最大重試次數:/(由SSLError(SSLError(“錯誤的握手:SysCallError(-1,'意外的EOF')”,)引起) ))

在處理上述異常期間,發生了另一個異常:

SSLError Traceback(最近一次通話最近)在()中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 in request(method,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 in request(自身,方法,URL,參數,數據,標頭,cookie,文件,身份驗證,超時,allow_redirects,代理,掛鈎,流,驗證,cert,json)506} 507 send_kwargs.update(settings)-> 508 resp = self.send(prep,** send_kwargs)509510 return resp

C:\\ ProgramData \\ Anaconda3 \\ lib \\ site-packages \\ requests \\ sessions.py in send(self,request,** kwargs)616617#發送請求-> 618 r = adapter.send(request,** kwargs )619620#請求經過的總時間(大約)

C:\\ ProgramData \\ Anaconda3 \\ lib \\ site-packages \\ requests \\ adapters.py in send((自身,請求,流,超時,驗證,證書,代理))504 if isinstance(e.reason,_SSLError):505#此分支適用於urllib3 v1.22和更高版本。 -> 506引發SSLError(e,request = request)507508引發ConnectionError(e,request = request)

SSLError:HTTPSConnectionPool(host ='www.mycardtamoil.it',端口= 443):url超過了最大重試次數:/(由SSLError(SSLError(“錯誤的握手:SysCallError(-1,'意外的EOF')”,引起),) ))

有人可以幫助我了解如何使用請求模塊對其進行修復嗎?

在此先感謝,Salvo

根據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/')

盡管現在不再獲得Unexpected EOF但它又出現了另一個錯誤: certificate verify failed 這是因為服務器設置不僅在協議版本和密碼方面被破壞,而且證書配置不正確。 SSLLabs報告還顯示了其他所有問題

該服務器的證書鏈不完整。

就像您通過添加更多不安全性一樣添加verify=False “解決”該問題,即跳過了證書的驗證。 有關如何正確解決此類情況的信息,請參見此處 盡管目前尚不清楚,在這種情況下(必須處理嚴重損壞且不安全的系統),正確檢查證書是否會真正顯着提高安全性。 我建議不要將任何敏感數據發送到此系統,無論是否使用HTTPS。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM