我们的付款处理合作伙伴目前只支持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的东西,就像我告诉它的那样。
答案 0 :(得分:2)
解决方案是使用s.get(带有挂载的HTTPAdapter的Session)而不是requests.get。