在Python 2.6中发送TLS 1.2请求

时间:2015-03-19 19:24:18

标签: python ssl request python-requests python-2.6

我使用Python 2.6时遇到困难,我需要使用TLS 1.2发送帖子请求。 Python 2.6的requests库是否支持TLS 1.2?如何确保/验证请求是通过TLS1.2而不是其他版本进行的?

示例请求

r=requests.post(url,data=payload,verify=False)

在论坛的某个地方,我开始知道我们需要编译pyOpenSSL来支持这一点。有更简单的方法吗?

2 个答案:

答案 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发送请求(看起来很奇怪,但如果实现正确则有效)。