即使我指定TLSv1.1,Python也会使用TLSv1.2请求模块

时间:2015-12-15 19:48:51

标签: python python-requests tls1.2

我们的付款处理合作伙伴目前只支持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"

关于使用请求库实现和挂载HTTPAdapter,我已经倾覆了skint文档,我找不到任何能说明我的客户端说TLSv1.2而不是TLSv1.1的东西,就像我告诉它的那样。

1 个答案:

答案 0 :(得分:2)

解决方案是使用s.get(带有挂载的HTTPAdapter的Session)而不是requests.get。