Python 中 ssl 模块所使用的 OpenSSL 版本(1.0.2k-fips)和系统中 openssl 命令所使用的 OpenSSL 版本(1.1.1u)不一致(已解决)

在使用Linux中配置yolov5环境时遇到问题:

[root@iZ2ze9bdu1sca12rizazfkZ qcby-project]# python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 1.0.2k-fips  26 Jan 2017
[root@iZ2ze9bdu1sca12rizazfkZ qcby-project]# openssl version
OpenSSL 1.1.1u  30 May 2023

[root@iZ2ze9bdu1sca12rizazfkZ qcby-project]# python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 1.0.2k-fips  26 Jan 2017
[root@iZ2ze9bdu1sca12rizazfkZ qcby-project]# openssl version
OpenSSL 1.1.1u  30 May 2023

从报错信息来看,系统的 OpenSSL 已经升级到了 1.1.1u,但 Python 的 ssl 模块仍然在使用旧的 OpenSSL 1.0.2k-fips。这是因为 Python 在编译时绑定了旧的 OpenSSL 库,因此即使系统上安装了新版本的 OpenSSL,Python 仍然使用编译时的旧版本。

要解决这个问题,需要重新编译和安装 Python,使其链接到新版本的 OpenSSL。

以下是解决步骤:


步骤 1:确认 OpenSSL 新版本的路径

确保新版本 OpenSSL 的路径正确。通常安装在 /usr/local/openssl,您可以检查:

ls /usr/local/openssl/bin

确保可以看到 openssl 文件。


步骤 2:下载并重新编译 Python 源代码

1. 下载 Python 源代码

从官方源下载与您当前使用版本一致的 Python 源代码(或您想要升级的版本)。

wget https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tgz
tar -xvzf Python-3.9.16.tgz
cd Python-3.9.16
2. 配置 Python 编译

在配置 Python 时,指定新的 OpenSSL 路径:

./configure --with-openssl=/usr/local/openssl --prefix=/usr/local/python3.9
3. 编译并安装

编译过程可能需要几分钟。

make
sudo make altinstall

注意:使用 make altinstall 而不是 make install,以避免覆盖系统默认的 python 二进制文件。


步骤 3:验证 Python 是否使用新 OpenSSL

安装完成后,验证 Python 是否使用了正确的 OpenSSL 版本。

/usr/local/python3.9/bin/python3.9 -c "import ssl; print(ssl.OPENSSL_VERSION)"

这应该输出 OpenSSL 1.1.1u


步骤 4:更新默认 Python3(可选)

如果需要将新编译的 Python 设为默认的 python3,可以更新软链接:

sudo ln -sf /usr/local/python3.9/bin/python3.9 /usr/bin/python3

完成这些步骤后,您的 Python 应该能够正确使用 OpenSSL 1.1.1u,并解决 urllib3 的兼容性问题。

你可能感兴趣的:(python,ssl,开发语言)