You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动