Python ssl模块无PROTOCOL_TLSv1_3属性问题咨询
问题解答
原因分析
- Python 3.8的标准库
ssl模块中,PROTOCOL_TLSv1_3常量虽在Python 3.7.3及以上版本已添加,但Ubuntu 20.04默认打包的Python 3.8可能因编译配置限制,未暴露该常量。 - 你的OpenSSL 1.1.1f本身支持TLSv1.3(OpenSSL 1.1.1及以上原生支持),但Python的
ssl模块是否提供该常量,完全取决于编译Python时的配置:若编译时链接的OpenSSL版本低于1.1.1,或未启用TLSv1.3相关编译选项,就会出现这个报错。 - 可以运行以下代码验证当前Python环境的
ssl模块支持的常量:
若输出中无import ssl print(dir(ssl))PROTOCOL_TLSv1_3,则确认当前环境未暴露该属性。
解决办法
方法1:通过通用TLS上下文强制指定TLSv1.3
无需直接使用PROTOCOL_TLSv1_3,可创建通用TLS上下文后,通过版本限制强制仅使用TLSv1.3,该方式兼容Python 3.7+(含3.8):
import ssl context = ssl.SSLContext(ssl.PROTOCOL_TLS) # 限制仅使用TLSv1.3 context.min_version = ssl.TLSVersion.TLSv1_3 context.max_version = ssl.TLSVersion.TLSv1_3
方法2:重新编译Python 3.8
若必须使用PROTOCOL_TLSv1_3常量,可重新编译Python 3.8,确保编译时链接系统的OpenSSL 1.1.1f:
- 安装编译依赖:
sudo apt-get install build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl git - 下载并解压Python 3.8源码:
wget https://www.python.org/ftp/python/3.8.18/Python-3.8.18.tgz tar -xf Python-3.8.18.tgz cd Python-3.8.18 - 配置编译选项(指定系统OpenSSL路径):
./configure --prefix=/usr/local/python3.8 --with-openssl=/usr - 编译并安装:
make -j$(nproc) sudo make install - 使用新编译的Python 3.8执行代码即可。
内容的提问来源于stack exchange,提问作者SilverTear
相关产品推荐
相关产品推荐

