CentOS系统下升级Python的openssl过程记录

问题:运行一个软件提示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+ 的问题。

请按照以下步骤操作:

  1. 检查当前 OpenSSL 版本:
    打开终端,并输入以下命令来检查当前系统上的 OpenSSL 版本:

    openssl version
    

    如果你的版本是 OpenSSL 1.1.1 或更新版本,那么问题可能在其他地方。如果版本是 1.0.2 或更低,你需要继续更新它。

  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 应该会安装更新。

  3. 确认 Python 使用的 OpenSSL 版本:
    更新 OpenSSL 后,确保 Python 正确链接了新版本的 OpenSSL。如果没有,可能需要重新编译 Python,这样才能使用更新的库。

    若要验证 Python 正确使用新的 OpenSSL 版本,你可以在 Python 环境中执行以下命令:

    import ssl
    print(ssl.OPENSSL_VERSION)
    

    加入你这么做了,而输出的版本仍旧不是 1.1.1 或以上,这意味着你可能需要重新编译 Python 来链接到更新的 OpenSSL 版本。

  4. 重新编译 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库涉及以下步骤:

  1. 安装OpenSSL库
    确保在系统中安装了所需版本的OpenSSL库。可以使用系统包管理器(如aptyumbrew等)或从源代码编译安装。

  2. 设置环境变量
    编译Python之前,需要设置环境变量来指示编译器和链接器OpenSSL库的位置,特别是LD_LIBRARY_PATH(Linux)、DYLD_LIBRARY_PATH(Mac)以及CFLAGSLDFLAGS用于指明头文件和库文件的路径。

    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

  3. 使用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
    
  4. 验证
    编译并安装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”
配置环境变量的方法自行百度。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

f2595001965

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值