Python 3.6.5(Windows10)下如何获取服务器选定的TLS版本?
获取服务器选定的TLS版本(Python 3.6.5 + Windows 10)
我看你已经写了大部分核心代码啦,只是最后获取版本的部分有点小疏漏,刚好Python 3.6里有现成的方法能拿到服务器最终选定的TLS版本——也就是握手后实际使用的那个,不是客户端提供的可选列表。
修正后的完整代码
import socket import ssl # 创建默认SSL上下文,自动适配系统支持的安全协议 context = ssl.create_default_context() # 创建基础TCP套接字 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) domain = 'google.com' # 包装套接字并指定服务器域名(支持SNI,避免证书匹配错误) ssl_socket = context.wrap_socket(s, server_hostname=domain) try: # 建立连接并完成TLS握手 ssl_socket.connect((domain, 443)) # 获取服务器最终选定的TLS版本 selected_tls_version = ssl_socket.version() print(f"服务器选定的TLS版本: {selected_tls_version}") finally: # 确保套接字资源被正确释放 ssl_socket.close()
关键细节说明
- 你之前的代码里变量名打错了(
sslSocke...应该是sslSocket),我统一改成了更规范的ssl_socket ssl_socket.version()方法在握手完成后返回的就是协商后实际使用的TLS版本,完全对应你要的“服务器选定的版本”,而非客户端支持的可选范围- 用
try...finally包裹是为了避免连接异常时套接字资源泄漏,属于稳妥的编码习惯
额外可选调整
如果你想手动限制客户端支持的TLS版本范围(比如只允许TLS 1.2及以上),可以修改上下文配置:
# 自定义客户端SSL上下文,限定版本范围 context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) context.min_version = ssl.TLSVersion.TLSv1_2 context.max_version = ssl.TLSVersion.TLSv1_3 context.check_hostname = True context.verify_mode = ssl.CERT_REQUIRED context.load_default_certs()
调整后服务器会从你指定的范围内挑选它也支持的最优版本,ssl_socket.version()依然能拿到最终选定的结果。
内容的提问来源于stack exchange,提问作者user9371654




