问题:运行一个软件提示openssl版本过低。报错:“ImportError: urllib3 v2 only supports OpenSSL 1.1.1+, currently the ‘ssl’ module is compiled with ‘OpenSSL 1.0.2k-fips 26 Jan 2017’. See: https://github.com/urllib3/urllib3/issues/2168”
尝试解决1:通过ChatGPT提问获得解决办法
既然你使用的是 CentOS 系统,我们将重点讨论在这个环境下如何解决 ImportError: urllib3 v2 only supports OpenSSL 1.1.1+
的问题。
请按照以下步骤操作:
-
检查当前 OpenSSL 版本:
打开终端,并输入以下命令来检查当前系统上的 OpenSSL 版本:openssl version
如果你的版本是 OpenSSL 1.1.1 或更新版本,那么问题可能在其他地方。如果版本是 1.0.2 或更低,你需要继续更新它。
-
升级 OpenSSL 版本:
对于 CentOS 7,比较简单的方法是启用 EPEL (Extra Packages for Enterprise Linux) 仓库,然后安装 OpenSSL 1.1.1。以下是相关命令:sudo yum install epel-release sudo yum update sudo yum install openssl11
对于 CentOS 8,EPEL 仓库应该默认包含 OpenSSL 1.1.1。运行
sudo yum update
应该会安装更新。 -
确认 Python 使用的 OpenSSL 版本:
更新 OpenSSL 后,确保 Python 正确链接了新版本的 OpenSSL。如果没有,可能需要重新编译 Python,这样才能使用更新的库。若要验证 Python 正确使用新的 OpenSSL 版本,你可以在 Python 环境中执行以下命令:
import ssl print(ssl.OPENSSL_VERSION)
加入你这么做了,而输出的版本仍旧不是 1.1.1 或以上,这意味着你可能需要重新编译 Python 来链接到更新的 OpenSSL 版本。
-
重新编译 Python(如果必要):
如果 Python 使用的仍是旧版 OpenSSL,你可能需要重新编译 Python。确保在编译 Python 之前已经安装了新版本的 OpenSSL。根据你使用的 Python 版本,下载相应的源代码并重新编译安装。例如:sudo yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel wget https://www.python.org/ftp/python/3.x.x/Python-3.x.x.tgz tar xzf Python-3.x.x.tgz cd Python-3.x.x ./configure --with-openssl=/usr/local/ssl --enable-optimizations make altinstall
替换
3.x.x
为具体的 Python 版本号,并检查--with-openssl
参数指向的路径是否为新版 OpenSSL 的安装路径。
请注意,在对系统进行重大更改之前,应仔细检查要进行的操作,并在可能的情况下,在测试环境中验证更改。如果涉及重要服务,请确保备份所有必要的数据。
由于我无法直接访问你的系统,你需要在系统上执行上述步骤。如果你在执行这些步骤时需要帮助,请随时询问。
解决结果:查看系统openssl
但是Python检测ssl版本
尝试卸载重装openssl,python导入的ssl版本还是不变。
最后成功解决办法:重新编译Python。
在Python中编译时确保找到正确版本的OpenSSL库涉及以下步骤:
-
安装OpenSSL库:
确保在系统中安装了所需版本的OpenSSL库。可以使用系统包管理器(如apt
、yum
、brew
等)或从源代码编译安装。 -
设置环境变量:
编译Python之前,需要设置环境变量来指示编译器和链接器OpenSSL库的位置,特别是LD_LIBRARY_PATH
(Linux)、DYLD_LIBRARY_PATH
(Mac)以及CFLAGS
和LDFLAGS
用于指明头文件和库文件的路径。export LDFLAGS="-L/path/to/openssl/lib" export CFLAGS="-I/path/to/openssl/include" export LD_LIBRARY_PATH="/path/to/openssl/lib:$LD_LIBRARY_PATH"
注意用实际OpenSSL库安装位置替换
/path/to/openssl
。 -
使用
configure
脚本:
当编译Python源代码时,使用configure
脚本并传入正确的参数来令它识别OpenSSL的路径。./configure --with-openssl=/path/to/openssl make make test # optional, to run tests sudo make install # or `make altinstall` to avoid replacing the default python binary
-
验证:
编译并安装Python后,验证是否正确使用了指定的OpenSSL。import ssl print(ssl.OPENSSL_VERSION)
请注意,指定的路径应该指向OpenSSL库的安装目录,该路径应该包含库文件(.so
、.dylib
或.dll
)和头文件(通常在include
目录下)。
如果以上不起作用,考虑以下额外的步骤和注意事项:
- 确保没有版本冲突,检查系统中是否有多个OpenSSL版本,并确保
PATH
环境变量首先指向正确版本的bin
目录。 - 检查Python编译日志来确认编译过程中使用的是正确的OpenSSL路径。
- 在某些系统上,如果编译器和链接器不遵循
LD_LIBRARY_PATH
,你可能需要调整/etc/ld.so.conf
文件或运行ldconfig
。
最后,操作系统、编译器和链接器可能会有不同的配置方法,所以请参考具体系统和工具的文档以获取最准确的信息。
我的环境变量是:
export LDFLAGS=“-L/usr/local/lib”
export CFLAGS=“-I/usr/local/include”
export LD_LIBRARY_PATH=“/usr/local/lib:$LD_LIBRARY_PATH”
export LIBRARY_PATH=“/usr/local/lib:$LIBRARY_PATH”
配置环境变量的方法自行百度。