在Debian上基于OpenSSL 3.0.8构建Python 3.9.2 FIPS版本失败
解决Python 3.9.2编译OpenSSL 3.0.8 FIPS版本时的SSL模块错误
问题根源
Python 3.9.2原生仅支持OpenSSL 1.0.2/1.1.x系列,对OpenSSL 3.x的API兼容性不足,导致编译时无法找到SSL_get1_peer_certificate、EVP_MD_get_type等符号,进而无法构建_ssl和_hashlib模块。
解决步骤
1. 给Python 3.9.2打OpenSSL 3.x兼容补丁
Python 3.9分支后期的官方提交(commit 8d2b4f0d)添加了OpenSSL 3的适配支持,你需要获取该补丁并应用到Python 3.9.2源码中:
- 从CPython的代码仓库3.9分支找到对应提交的补丁文件
- 进入Python 3.9.2源码目录,执行:
patch -p1 < 补丁文件名.patch
2. 配置编译环境变量
确保编译器能正确找到OpenSSL 3.0.8的头文件和库文件(替换/usr/local/ssl为你的实际安装路径):
export CPPFLAGS="-I/usr/local/ssl/include" export LDFLAGS="-L/usr/local/ssl/lib64 -Wl,-rpath=/usr/local/ssl/lib64" export LD_LIBRARY_PATH="/usr/local/ssl/lib64:$LD_LIBRARY_PATH"
3. 重新配置并编译Python
清理之前的编译残留,重新执行配置和编译:
# 清理旧编译文件 make clean # 配置编译参数,明确指定OpenSSL路径 ./configure --enable-optimizations --with-openssl=/usr/local/ssl # 多线程编译 make -j$(nproc) # 安装 make install
4. 验证修复结果
运行Python 3.9.2,检查SSL模块是否正常:
import ssl print(ssl.OPENSSL_VERSION) # 应输出:OpenSSL 3.0.8-fips [对应日期]
额外注意事项
- 确保OpenSSL 3.0.8是正确编译并启用FIPS的:
# 编译OpenSSL时需添加enable-fips参数 cd openssl-3.0.8 ./config enable-fips --prefix=/usr/local/ssl --openssldir=/usr/local/ssl make && make install && make install_fips ldconfig /usr/local/ssl/lib64 - 若
openssl version未显示fips标识,需重新配置FIPS模块:openssl fipsinstall -out /usr/local/ssl/fipsmodule.cnf -module /usr/local/ssl/lib64/ossl-modules/fips.so - 编辑
/usr/local/ssl/openssl.cnf,在开头添加openssl_conf = openssl_init,并在文件末尾添加:[openssl_init] providers = provider_sect [provider_sect] fips = fips_sect base = base_sect [fips_sect] activate = 1 module = /usr/local/ssl/lib64/ossl-modules/fips.so [base_sect] activate = 1
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

