我使用Python 2.6时遇到困难,我需要使用TLS 1.2发送帖子请求。 Python 2.6的requests
库是否支持TLS 1.2?如何确保/验证请求是通过TLS1.2而不是其他版本进行的?
示例请求
r=requests.post(url,data=payload,verify=False)
在论坛的某个地方,我开始知道我们需要编译pyOpenSSL
来支持这一点。有更简单的方法吗?
答案 0 :(得分:12)
Python 2.6中的ssl
模块仅支持TLS 1.0。如果您不希望引入其他依赖项(例如您建议的pyOpenSSL),则需要升级到Python 2.7或3.x以获得对较新版本TLS的支持。
使用适当的construct an SSLContext
在 Python 2.7.9或更高版本,PROTOCOL_*
constant中强制使用特定版本的TLS。然后,您可以将其与任何API一起使用,以便您提供自己的SSLContext
。
import ssl
import urllib2
ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
# set other SSLContext options you might need
response = urllib2.urlopen(url, context=ctx)
要使用特定协议版本或更高版本(包括未来版本),请使用ssl.PROTOCOL_SSLv23
,然后禁用您不想使用的协议版本:
ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
# allow TLS 1.2 and later
ctx.options |= ssl.OP_NO_SSLv2
ctx.options |= ssl.OP_NO_SSLv3
ctx.options |= ssl.OP_NO_TLSv1
ctx.options |= ssl.OP_NO_TLSv1_1
至于使用带有请求的自定义SSLContext
以强制使用特定协议版本, according to the documentation似乎没有办法执行此操作,{{ 3}}
答案 1 :(得分:0)
如果无法升级代码,您应该能够使用squid服务器或nginx代理连接。这是一个鱿鱼“碰撞”方法的例子:
Can I use Squid to upgrade client TLS connections?
另一种选择是保留代理但重写URL(http到https)并让你的应用程序向http发送请求(看起来很奇怪,但如果实现正确则有效)。