2017-05-08 166 views
0

我試圖用請求庫向服務器發送一個post請求。我使用下面的堆棧:SSLError :(「壞握手:SysCallError(54,'ECONNRESET')」,)

appdirs==1.4.3 
asn1crypto==0.22.0 
boto==2.46.1 
certifi==2017.4.17 
cffi==1.10.0 
cryptography==1.8.1 
enum34==1.1.6 
idna==2.5 
inflection==0.3.1 
ipaddress==1.0.18 
ndg-httpsclient==0.4.2 
packaging==16.8 
pyasn1==0.2.3 
pycparser==2.17 
pyOpenSSL==17.0.0 
pyparsing==2.2.0 
qds-sdk==1.9.6 
requests==2.13.0 
six==1.10.0 
urllib3==1.21.1 

但請求總是失敗,下面的錯誤:

Traceback (most recent call last): 
    File "/usr/local/bin/qds.py", line 625, in <module> 
sys.exit(main()) 
    File "/usr/local/bin/qds.py", line 575, in main 
return cmdmain(a0, args) 
    File "/usr/local/bin/qds.py", line 203, in cmdmain 
return globals()[action + "action"](cmdclass, args) 
    File "/usr/local/bin/qds.py", line 138, in runaction 
cmd = cmdclass.run(**args) 
    File "/usr/local/lib/python2.7/site-packages/qds_sdk/commands.py", line 96, in run 
    cmd = cls.create(**kwargs) 
    File "/usr/local/lib/python2.7/site-packages/qds_sdk/commands.py", line 77, in create 
return cls(conn.post(cls.rest_entity_path, data=kwargs)) 
    File "/usr/local/lib/python2.7/site-packages/qds_sdk/connection.py", line 59, in post 
    return self._api_call("POST", path, data) 
    File "/usr/local/lib/python2.7/site-packages/qds_sdk/connection.py", line 98, in _api_call 
    return self._api_call_raw(req_type, path, data=data, params=params).json() 
    File "/usr/local/lib/python2.7/site-packages/qds_sdk/connection.py", line 86, in _api_call_raw 
    r = x.post(url, timeout=300, **kwargs) 
    File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 535, in post 
    return self.request('POST', url, data=data, json=json, **kwargs) 
    File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 488, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 609, in send 
r = adapter.send(request, **kwargs) 
    File "/usr/local/lib/python2.7/site-packages/requests/adapters.py", line 497, in send 
    raise SSLError(e, request=request) 
    SSLError: ("bad handshake: SysCallError(54, 'ECONNRESET')",) 

當我使用開放0.9.8連接到服務器,給出以下錯誤:

> openssl s_client -connect <ip>:443 
CONNECTED(00000003) 
write:errno=54 

但隨着OpenSSL的連接成功更高的版本,我認爲蟒蛇不知何故使用較低版本,但是當我檢查SSL,它顯示出更高版本:

> python -c 'import ssl; print(ssl.OPENSSL_VERSION)' 
OpenSSL 1.0.2k 26 Jan 2017 

不知道這裏發生了什麼事。我不知道如何格式化,抱歉。

回答

0

我能找到這個問題的解決方案,我只是改變了SSL協議類型,而從「ssl.PROTOCOL_TLSv1」到「ssl.PROTOCOL_TLSv1_2」創建PoolManager如下,這解決了以上問題:

self.poolmanager = PoolManager(num_pools=connections, 
            maxsize=maxsize, 
            block=block, 
            ssl_version=ssl.PROTOCOL_TLSv1_2) 

但上述會給InsecureRequests警告,可以使用下面的命令壓制相同:

from requests.packages.urllib3.exceptions import InsecureRequestWarning 
requests.packages.urllib3.disable_warnings(InsecureRequestWarning) 

希望它能幫助。