强制请求库在Python中使用TLSv1.1或TLSv1.2

Mr.*_*ing 8 python ssl

我正在尝试使用python中的请求库向服务器发送POST调用.之前我能够成功发送POST调用,但最近,服务器弃用了TLSv1.0,现在只支持TLSv1.1和TLSv1.2.现在相同的代码抛出一个"requests.exceptions.SSLError:EOF发生违反协议(_ssl.c:590)"错误.

我在stackoverflow上发现了这个线程Python请求requests.exceptions.SSLError:[Errno 8] _ssl.c:504:EOF违反了协议,这表示我们需要继承HTTPAdapter,之后会话对象将使用TLSv1.我相应地更改了我的代码,这是我的新代码

class MyAdapter(HTTPAdapter):
    def init_poolmanager(self, connections, maxsize, block=False):
    self.poolmanager = PoolManager(num_pools=connections,
                               maxsize=maxsize,
                               block=block,
                               ssl_version=ssl.PROTOCOL_TLSv1)

url="https://mywebsite.com/ui/"
headers={"Cookie":"some_value","X-CSRF-Token":"some value","Content-Type":"application/json"}    
payload={"name":"some value","Id":"some value"}    
s = requests.Session()
s.mount('https://', MyAdapter())

r=s.post(url,json=payload,headers=headers)
html=r.text
print html
Run Code Online (Sandbox Code Playgroud)

但即使使用了这个,我也得到了同样的错误"违反协议的EOF(_ssl.c:590)".

我的第一个问题是,我在某处读取默认使用ssl的请求.我知道我的服务器使用的是TLSv1.0,我的代码是否正常工作,因为TLSv1.0与ssl3.0向后兼容?

我的第二个问题是,我上面提到的stackoverflow线程使用了我将我的代码更改为子类HTTPAdapter,表示这将适用于TLSv1.但是由于我的服务器中不推荐使用TLSv1.0,这段代码仍然有效吗?

Ste*_*ich 6

TLS堆栈将使用自动提供的最佳版本.如果在服务器上禁用TLS 1.0支持时它不再起作用,则通常意味着本地TLS堆栈不支持更新的协议版本,如TLS 1.2.在Mac OS X上经常出现这种情况,因为它附带了旧版本的OpenSSL(0.9.8).在这种情况下,没有python代码可以帮助您解决问题,但您需要获得一个使用较新版本的OpenSSL的python.

要检查您正在使用哪个openssl版本,请在python中执行以下命令:

import ssl
print ssl.OPENSSL_VERSION
Run Code Online (Sandbox Code Playgroud)

要获得对TLS 1.2的支持,您需要OpenSSL版本1.0.2或1.0.1.如果您只有1.0.0或0.9.8,则需要升级python + OpenSSL.有关如何执行此操作的更多信息,请参阅在python 2.7中更新openssl.