如何在Python 3.6.5 OpenSSL客户端中仅启用TLS 1.2并禁用旧版协议
实现Python TLS客户端仅支持TLS 1.2
没问题,我来帮你搞定这个需求——让你的Python TLS客户端只支持TLS 1.2,彻底禁用那些老旧不安全的协议版本(TLS 1.0、TLS 1.1、SSLv3、SSLv2)。结合你用的Python 3.6.5(Windows 10环境+OpenSSL),具体实现如下:
核心思路
要达到目标,我们需要做两件关键的事:
- 禁用所有不需要的旧协议版本,通过
ssl模块提供的OP_NO_*选项 - 明确限定客户端只能使用TLS 1.2作为唯一的协议版本
完整代码示例
下面是可直接使用的代码,我会在后面解释每个关键部分:
import ssl import urllib.request # 创建默认安全SSL上下文(自带基础安全配置) ctx = ssl.create_default_context() # 叠加禁用旧协议的选项:把这些选项按位或到上下文的options里 ctx.options |= ssl.OP_NO_TLSv1 # 禁用TLS 1.0 ctx.options |= ssl.OP_NO_TLSv1_1 # 禁用TLS 1.1 ctx.options |= ssl.OP_NO_SSLv3 # 禁用SSLv3 ctx.options |= ssl.OP_NO_SSLv2 # 禁用SSLv2 # 明确限定协议版本范围:最小和最大都设为TLS 1.2 ctx.min_version = ssl.TLSVersion.TLSv1_2 ctx.max_version = ssl.TLSVersion.TLSv1_2 # 可选:指定安全的TLS 1.2密码套件(进一步提升安全性,可根据需求调整) ctx.set_ciphers('ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256') # 使用配置好的上下文发起HTTPS请求 try: with urllib.request.urlopen('https://your-target-server.com', context=ctx) as response: print("请求成功,响应状态码:", response.getcode()) # 处理响应内容 # content = response.read() except ssl.SSLError as e: print("SSL连接错误:", str(e))
关键细节说明
create_default_context()的作用:这个方法会创建一个带有安全默认设置的上下文(比如禁用SSLv3等),但我们需要额外禁用TLS 1.0和1.1,所以叠加了对应的OP_NO_*选项。- 限定协议版本范围:通过
min_version和max_version强制客户端只使用TLS 1.2,这是双重保障——即使options的设置有遗漏,版本范围限定也能确保不会使用其他协议。 - 密码套件配置:指定仅支持TLS 1.2兼容的安全密码套件,避免使用弱加密算法。如果你不需要这么严格,也可以省略这一步,但建议保留以提升安全性。
- 版本兼容性:Python 3.6.5已经支持
ssl.TLSVersion枚举和所有上述OP_NO_*选项,和你使用的版本完全匹配,不用担心兼容性问题。
另外,你可以通过以下代码检查当前Python环境的OpenSSL版本,确保它支持TLS 1.2:
import ssl print("OpenSSL版本:", ssl.OPENSSL_VERSION)
只要版本在1.0.1及以上,就支持TLS 1.2,Python 3.6.5搭配的OpenSSL版本通常满足这个要求。
内容的提问来源于stack exchange,提问作者user9371654
相关产品推荐
相关产品推荐

