在Python 2.6中发送TLS 1.2请求

2024-04-29 22:30:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在使用Python 2.6,我需要使用TLS 1.2发送post请求。Python 2.6的requests库是否支持TLS 1.2?如何确保/验证请求是通过TLS1.2而不是其他版本发出的?

示例请求是

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

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


Tags: 方法版本falseurl示例data地方tls
2条回答

Python 2.6中的ssl模块最多只支持TLS 1.0。如果您不希望引入其他依赖项(如您建议的pyOpenSSL),则需要升级到Python 2.7或3.x以获得对较新版本TLS的支持。

要在Python 2.7.9或更高版本中强制使用TLS的特定版本,请使用适当的^{} constant。然后,您可以将它与任何允许您提供自己的SSLContext的API一起使用。

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似乎没有办法这样做see the following example from the docs

如果升级代码不是一个选项,那么您应该能够使用squid服务器或nginx代理您的连接。下面是一个squid“bump”方法示例:

Can I use Squid to upgrade client TLS connections?

另一个选择是保留代理,但重写URL(http到https)并让应用程序将请求发送到http(看起来很奇怪,但如果实现正确则可以工作)。

相关问题 更多 >