【发布时间】:2023-03-30 05:15:01
【问题描述】:
我们的支付处理合作伙伴暂时只能支持 TLSv1.1。切换处理器目前不是一种选择。
在 Python 2.7.10 中,我有一个脚本从我的开发 Web 服务器请求 GET,但在运行时它使用 TLSv1.2 而不是 TLSv1.1,就像我告诉它的那样。
import requests
from requests.packages.urllib3.poolmanager import PoolManager
import ssl
class MyAdapter(requests.adapters.HTTPAdapter):
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(
num_pools=connections,
maxsize=maxsize,
block=block,
ssl_version=ssl.PROTOCOL_TLSv1_1,
)
print("poolmanager set")
def do_it():
with requests.Session() as s:
s.mount('https://', MyAdapter())
url = 'https://my.server.com/api/3.0/order/?page=1&limit=10'
response = requests.get(url, verify=True)
print("status code: %r" % response.status_code)
if __name__ == '__main__':
print do_it()
输出是:
poolmanager set
status code: 200
但是,我的 nginx 访问日志显示使用的协议是 TLSv1.2:
127.0.0.1 - [15/Dec/2015:13:38:19 -0600] TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256 "GET /api/3.0/order/?page=1&limit=10 HTTP/1.1" 200 176 "-" "python-requests/2.9.0"
我已经翻阅了有关使用请求库实现和安装 HTTPAdapters 的 skint 文档,但我找不到任何可以说明为什么我的客户端使用 TLSv1.2 而不是我告诉它的 TLSv1.1 的任何内容。
【问题讨论】:
-
我认为 ssl_verson 不正确。应该是 ssl_version?
-
@rfkortekaas 感谢您的关注。我认为肯定会是这样,但更正那个错字并没有什么不同。我目前看到使用直接 urllib2 取得了一些成功,但仍然需要解决问题。我现在将更新问题。
-
您还需要 s.get 才能将会话对象与 HTTPadapter 一起使用
-
@rfkortekaas 是对的 - 您正在设置会话并安装适配器,但随后 您没有使用会话(这就是关键字中的错字的原因参数没有触发错误,您的适配器从未被使用过)。
-
确实是@rfkortekaas 指出了解决方案,所以我当然不值得任何信任 ;-) 自我回答并给予他信任,恕我直言,这是完全可以的,但你也可以给予他有时间写下自己的答案。据我所知,您也可以稍后更改接受的答案。
标签: python python-requests tls1.2