python3.9 + openssl基于源码构建

错误日志

1
ImportError: urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'OpenSSL 1.0.2k-fips  26 Jan 2017'

意思是:你 Python 的 ssl 模块仍然依赖系统默认 OpenSSL 1.0.2k,而你安装的 urllib3 v2requests 都要求 OpenSSL >=1.1.1。这在 CentOS 7 上是非常典型的问题,因为系统自带的 OpenSSL 太老了。


1. 编译安装 Python/OpenSSL

1.1 先安装 OpenSSL 1.1.1 或 3.x 到独立目录

1
2
3
4
5
6
7
8
cd /usr/local/src
wget https://www.openssl.org/source/openssl-3.1.3.tar.gz
tar xf openssl-3.1.3.tar.gz

cd openssl-3.1.3
./config --prefix=/usr/local/openssl-3 --openssldir=/usr/local/openssl-3
make -j$(nproc)
make install

1.2.重新编译 Python 3.9 并使用这个 OpenSSL

1
2
3
4
5
6
7
8
9
10
cd /usr/local/src/Python-3.9.19
make clean

./configure \
--prefix=/usr/local/python3.9 \
--enable-optimizations \
--enable-shared \
--with-openssl=/usr/local/openssl-3
make -j$(nproc)
make install

关键是 --with-openssl=/usr/local/openssl-3,这样 Python 的 ssl 模块就会使用新 OpenSSL。

1.3.配置动态库路径

1
2
3
4
echo "/usr/local/openssl-3/lib" > /etc/ld.so.conf.d/openssl-3.conf
echo "/usr/local/python3.9/lib" > /etc/ld.so.conf.d/python3.9.conf

ldconfig

1.4验证

1
/usr/local/python3.9/bin/python3.9 -m ssl

如果没有报错,说明 Python 已经链接到新 OpenSSL。