2024-04-29 22:30:42 发布
网友
我一直在使用Python 2.6,我需要使用TLS 1.2发送post请求。Python 2.6的requests库是否支持TLS 1.2?如何确保/验证请求是通过TLS1.2而不是其他版本发出的?
requests
示例请求是
r=requests.post(url,data=payload,verify=False)
在论坛上的某个地方,我知道我们需要编译pyOpenSSL来支持这一点。有更简单的方法吗?
pyOpenSSL
Python 2.6中的ssl模块最多只支持TLS 1.0。如果您不希望引入其他依赖项(如您建议的pyOpenSSL),则需要升级到Python 2.7或3.x以获得对较新版本TLS的支持。
ssl
要在Python 2.7.9或更高版本中强制使用TLS的特定版本,请使用适当的^{} constant。然后,您可以将它与任何允许您提供自己的SSLContext的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,然后禁用不想使用的协议版本:
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(看起来很奇怪,但如果实现正确则可以工作)。
Python 2.6中的
ssl
模块最多只支持TLS 1.0。如果您不希望引入其他依赖项(如您建议的pyOpenSSL),则需要升级到Python 2.7或3.x以获得对较新版本TLS的支持。要在Python 2.7.9或更高版本中强制使用TLS的特定版本,请使用适当的^{} constant 。然后,您可以将它与任何允许您提供自己的
SSLContext
的API一起使用。要使用特定的协议版本或更高的(包括将来的版本),请使用
ssl.PROTOCOL_SSLv23
,然后禁用不想使用的协议版本:至于对请求使用自定义
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(看起来很奇怪,但如果实现正确则可以工作)。
相关问题 更多 >
编程相关推荐