Linux / 疑难杂症 · 22 2 月, 2025 0

CentOS7编译安装包含SSL模块的Python3.10:解决SSLError错误

为什么会有这篇文章

首先,已经作古的CentOS7.9通过YUM能够安装Python3的最高版本为3.6。

笔者为了能够正常使用Ansible,尝试在CentOS7.9上编译安装Python3.10。虽然Python能启动,但当使用pip的时候,便会报这样的错误:

WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")'

这是由于编译Python的时候没有包含OpenSSL导致的。Python3.10需要OpenSSL最低版本为v1.1.1,不支持CentOS7.9内置的v1.0.1。

编译包含SSL的Python3.10

有上述内容可知,想要编译包含SSL模块的Python,首先需要升级OpenSSL。以下操作均为root权限执行。

0. 准备工作

安装编译工具:

# 安装依赖,如果已经安装则可以省略
yum groupinstall -y "Development Tools"
yum install -y openssl-devel bzip2-devel libffi-devel

1. 安装OpenSSL1.1

方法1:通过YUM安装

执行以下命令:

yum install -y epel-release
yum install -y openssl11-devel

NOTE:如果软件源过期导致404,请参考这篇文章解决。

方法2:自己编译安装(推荐)

cd到适当的目录,下载并解压OpenSSL:

wget https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-1.1.1w.tar.gz
tar -zxvf ./openssl-1.1.1w.tar.gz
cd ./openssl-1.1.1w

开始编译:

./config --prefix=/opt/openssl --openssldir=/opt/openssl shared zlib
make -j$(nproc)
make install
# 会将二进制文件安装到/opt/openssl/bin/openssl

添加libssl.so.1.1到系统动态库路径:

# 如果没有这一步,运行openssl会出现“无法加载libssl.so.1.1”错误
# 创建配置文件
echo "/opt/openssl/lib" | sudo tee /etc/ld.so.conf.d/openssl.conf
# 刷新动态库缓存
ldconfig
# 验证
ldconfig -p | grep libssl
/opt/openssl/bin/openssl version
# ^ 如果显示版本号则说明安装成功

2. 编译安装Python3.10

cd到适当的目录,执行以下命令:

# 下载解压Python3.10
wget https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tgz
tar zxvf Python-3.10.9.tgz
cd Python-3.10.9
方法1:如果你的OpenSSL是通过YUM安装

执行以下命令:

# 编译安装
## !!👇最关键的一步
sed -i 's/PKG_CONFIG openssl /PKG_CONFIG openssl11 /g' configure
./configure --enable-optimizations
make altinstall

此时Python被安装在了/usr/local/bin中,root用户无法直接运行。可以用以下命令将Python链接到root可执行的目录中:

# 注意:如果系统中原先安装了Python3,则需要事先将其备份到其他地方,或者用yum autoremove卸载。
ln -s /usr/local/bin/python3.10 /usr/bin/python3
ln -s /usr/local/bin/pip3.10 /usr/bin/pip3
方法2:如果你的OpenSSL是自己编译安装

执行以下命令:

# 先设置环境变量
export LD_LIBRARY_PATH=/opt/openssl/lib:$LD_LIBRARY_PATH
export CPPFLAGS="-I/opt/openssl/include"
export LDFLAGS="-L/opt/openssl/lib"
# 开始编译
./configure --prefix=/opt/python310 --with-openssl=/opt/openssl --with-openssl-rpath=auto
make -j$(nproc)

此时Python的二进制文件位于/opt/python310/bin/python3.10。同样,可以用以下命令将Python链接到root可执行的目录中:

# 注意:如果系统中原先安装了Python3,则需要事先将其备份到其他地方,或者用yum autoremove卸载。
ln -s /usr/local/bin/python3.10 /usr/bin/python3
ln -s /usr/local/bin/pip3.10 /usr/bin/pip3

3. 验证安装结果

用以下命令验证安装。如果没有报错则SSL模块安装成功。

python3 -m ssl