CentOS环境下升级Python3.10与OpenSSL1.1.1t后PyMongo哈希算法报错及SSL模块不可用问题求助
CentOS环境下升级Python3.10与OpenSSL1.1.1t后PyMongo哈希算法报错及SSL模块不可用问题求助
我完全理解你现在的困惑——升级Python和OpenSSL后碰到这种两难的问题确实头疼,一边是PyMongo调用pbkdf2_hmac时抛出ValueError: unsupported hash type sha256的错误,另一边是不关联OpenSSL编译的话,SSL模块又没法正常使用,两头卡壳太闹心了。下面我来帮你梳理问题原因并给出针对性的解决方案:
问题根源分析
你的两次编译遇到的问题本质是Python与OpenSSL的编译关联出现了异常:
- 第一次编译Python时虽然关联了自己编译的OpenSSL1.1.1t,但可能编译过程中Python没有正确识别到OpenSSL提供的哈希算法库,导致
sha256等算法无法被调用,进而触发PyMongo的报错。 - 第二次编译跳过了OpenSSL关联,Python默认使用了系统自带的旧版SSL依赖,虽然哈希算法功能恢复,但缺失了新版OpenSSL的支持,所以SSL模块无法正常加载。
具体解决步骤
1. 重新编译安装OpenSSL1.1.1t(确保编译正确)
首先清理之前可能安装不完整的OpenSSL,然后重新编译:
# 安装编译依赖 yum install -y gcc make zlib-devel # 下载并解压OpenSSL1.1.1t源码(如果还没下载) wget https://www.openssl.org/source/openssl-1.1.1t.tar.gz tar -zxf openssl-1.1.1t.tar.gz cd openssl-1.1.1t # 配置编译参数,指定自定义安装路径(避免覆盖系统默认OpenSSL) ./config --prefix=/usr/local/openssl-1.1.1t --openssldir=/usr/local/openssl-1.1.1t shared zlib # 编译并安装 make -j$(nproc) make install
2. 正确编译Python3.10并关联新版OpenSSL
编译Python前,必须通过环境变量让Python找到新版OpenSSL的头文件和库文件:
# 设置环境变量,指向刚安装的OpenSSL路径 export LD_LIBRARY_PATH=/usr/local/openssl-1.1.1t/lib:$LD_LIBRARY_PATH export CPPFLAGS="-I/usr/local/openssl-1.1.1t/include" export LDFLAGS="-L/usr/local/openssl-1.1.1t/lib" # 进入Python3.10源码目录,先清理旧编译缓存 cd python-3.10.x make clean # 配置Python编译选项,明确指定关联的OpenSSL路径 ./configure --prefix=/usr/local/python3.10 --with-openssl=/usr/local/openssl-1.1.1t --enable-shared # 编译并安装 make -j$(nproc) make install
3. 验证安装结果
安装完成后,验证两个核心功能是否正常:
- 测试SSL模块:
如果输出/usr/local/python3.10/bin/python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"OpenSSL 1.1.1t ...,说明SSL模块已正确关联新版OpenSSL。 - 测试哈希算法:
如果没有报错,说明哈希算法功能正常,此时再测试PyMongo连接,应该就能解决之前的报错了。import hmac import hashlib # 测试hmac的SHA256 print(hmac.new("AAA".encode('utf-8'), "BBB".encode('utf-8'),'SHA256').hexdigest()) # 测试pbkdf2_hmac的sha256 print(hashlib.pbkdf2_hmac('sha256', b'test_data', b'test_salt', 1000))
额外注意事项
- 不要轻易替换CentOS系统默认的OpenSSL,用自定义路径安装并通过环境变量让Python调用即可,避免破坏系统其他依赖组件。
- 如果编译Python时出现“Could not find OpenSSL headers”的警告,检查
CPPFLAGS和LDFLAGS是否正确指向了OpenSSL的安装路径,或者是否遗漏了zlib-devel依赖。 - 若后续系统环境变量有问题,可以将
LD_LIBRARY_PATH的配置添加到/etc/profile或用户的~/.bashrc中,确保每次登录都能生效。
备注:内容来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

