使用Python Requests库时,如何查询请求所采用的TLS版本?
嘿,这个问题我刚好在日常调试中碰到过好几次,其实有几种靠谱的方式能查到Requests发起请求时实际使用的TLS版本,我给你拆解一下具体做法:
方法1:启用Requests调试日志快速查看
这是最快捷的方式,不需要改太多代码,只要开启Requests的底层日志,就能在输出里找到TLS握手的细节。
你只需要先配置日志级别,然后发起请求,日志里会明确打印出使用的TLS版本:
import requests import logging # 开启urllib3的调试日志,Requests底层依赖它 logging.basicConfig(level=logging.DEBUG) requests.get('https://example.com')
运行后,你会在日志输出里找到类似这样的内容:
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): example.com:443
DEBUG:urllib3.connectionpool:https://example.com:443 "GET / HTTP/1.1" 200 648
DEBUG:urllib3.util.ssl_:Secure connection established: TLSv1.3
最后一行里的TLSv1.3就是实际使用的版本。
方法2:自定义适配器在代码中直接获取版本号
如果需要在代码逻辑里拿到TLS版本(比如做版本校验、日志记录),可以自定义一个HTTP适配器,通过访问底层的SSL套接字来获取版本:
import requests from requests.adapters import HTTPAdapter import ssl class TLSInfoAdapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): # 创建默认的SSL上下文,也可以自定义允许的TLS版本范围 ssl_context = ssl.create_default_context() kwargs['ssl_context'] = ssl_context return super().init_poolmanager(*args, **kwargs) # 创建Session并挂载自定义适配器 session = requests.Session() session.mount('https://', TLSInfoAdapter()) # 发起请求 response = session.get('https://example.com') # 从连接对象中获取SSL套接字,进而拿到TLS版本 connection = response.connection tls_version = connection.sock.version() print(f"当前请求使用的TLS版本:{tls_version}")
运行这段代码会直接输出类似当前请求使用的TLS版本:TLSv1.3的结果。
方法3:利用SSL上下文回调追踪握手过程
还有一种更灵活的方式,通过SSL上下文的握手后回调函数,在握手完成时自动获取TLS版本:
import requests import ssl from requests.adapters import HTTPAdapter # 定义握手完成后的回调函数 def log_tls_version(ssl_socket): tls_version = ssl_socket.version() print(f"TLS握手完成,使用版本:{tls_version}") # 创建Session和自定义SSL上下文 session = requests.Session() ssl_context = ssl.create_default_context() # 设置握手后回调 ssl_context.cb_after_handshake = log_tls_version # 挂载适配器 adapter = HTTPAdapter() adapter.init_poolmanager(ssl_context=ssl_context) session.mount('https://', adapter) # 发起请求,回调会自动触发 session.get('https://example.com')
补充说明
要注意,Requests支持的TLS版本其实依赖于你的Python版本和系统底层的OpenSSL版本:
- Python 3.7及以上版本默认支持TLS 1.2和1.3
- 如果系统OpenSSL版本过低,可能无法使用高版本的TLS
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

