• python报错:ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1


    python报错:ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+

    问题分析
    说明:requests包引入了urllib3,而新版本的urllib3 需要OpenSSL 1.1.1+以上版本,否则报错:
    ImportError: urllib3 v2.0 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

    三、解决方法
    需要升级openssl

    下载编译openssl

    1. 1. 依赖包
    2. 安装编译 OpenSSL 所需的包,包括 gcc、make、perl 和 zlib-devel。可以通过运行以下命令完成:
    3. yum install -y gcc make perl zlib-devel
    4. 2. 安装包下载
    5. 下载 OpenSSL 1.1.1 的源码包,可以从 OpenSSL 官网下载(https://www.openssl.org/source/openssl-1.1.1.tar.gz)或使用以下命令下载:
    6. wget https://www.openssl.org/source/openssl-1.1.1.tar.gz --no-check-certificate
    7. 后面的后缀是取消检查网站证书 直接下载会报一个ssl的错误
    8. 3. 解压
    9. 解压源码包并进入解压后的目录:
    10. tar -zxvf openssl-1.1.1.tar.gz
    11. cd openssl-1.1.1
    12. 4.初始化并编译、安装
    13. 运行以下命令编译 OpenSSL:
    14. ./config --prefix=/opt/openssl-1.1.1
    15. make
    16. make install
    17. 5. 添加环境变量
    18. vim /etc/profile
    19. export PATH=/opt/openssl-1.1.1/bin:$PATH
    20. export LD_LIBRARY_PATH=/opt/openssl-1.1.1/lib:$LD_LIBRARY_PATH
    21. source /etc/profile
    22. 这会在系统中安装新的 OpenSSL 版本。可以通过运行以下命令检查 OpenSSL 版本:
    23. openssl version
    24. 如果输出结果中的版本号为 1.1.1 或更高版本,则说明 OpenSSL 已成功升级。
    25. 6. 做软连接
    26. 如果还是原来的版本,没变成新版本,可以做软连接使其挂用新版本
    27. 将原来的openssl,做备份
    28. mv /usr/bin/openssl /usr/bin/openssl_20230525bak
    29. mv /usr/lib64/openssl /usr/lib64/openssl_20230525bak
    30. 然后将新安装的OpenSSL做软连接到这个路径
    31. ln -s /opt/openssl-1.1.1/bin/openssl /usr/bin/openssl
    32. 再执行以下命令检查 OpenSSL 版本:
    33. openssl version
    34. 完成!!


    升级openssl之后,依旧import urllib3 报错
    如果你已经确认系统中的OpenSSL显示为新版本,但Python仍然使用旧版本,可能是因为Python解释器没有正确链接到新版本的OpenSSL。

    思路1: 重新编译python
    重新编译Python是一种解决Python解释器没有正确链接到新版本OpenSSL的方法之一。这可以确保Python使用新版本的OpenSSL库

    配置编译选项:打开命令行终端,切换到Python源代码的目录,并运行以下命令以配置编译选项:

    1. ./configure --with-openssl=/path/to/openssl
    2. –with-ssl:表示使用了系统中已安装的 OpenSSL 库。
    3. –with-openssl:表示使用了自带的 OpenSSL 库。

    将 /path/to/openssl 替换为新版本OpenSSL库的安装路径。此选项告诉Python编译器在编译过程中使用新版本的OpenSSL。

    编译和安装:在命令行终端中运行以下命令以编译和安装重新配置的Python:

    1. make
    2. make install


    这将编译Python源代码并将其安装到系统中。注意,在执行sudo make install时,可能需要输入管理员密码。

    验证安装结果:重新编译和安装完成后,你可以通过运行以下命令来验证Python解释器是否链接到了新版本的OpenSSL:

    python -c "import ssl; print(ssl.OPENSSL_VERSION)"


    使用 --with-openssl 亲测可用!推荐~

    思路2: 指定Python解释器链接到新版本的OpenSSL,而不重新编译Python
    如果你已经安装了新版本的OpenSSL,并且希望指定Python解释器链接到该新版本的OpenSSL,而不重新编译Python,可以通过设置环境变量LD_LIBRARY_PATH(Linux)或DYLD_LIBRARY_PATH(macOS),将新版本的OpenSSL库路径添加到Python解释器的运行环境中。

    例如,假设新版本的OpenSSL库位于 /usr/local/ssl/lib,你可以执行以下操作:

    export LD_LIBRARY_PATH=/usr/local/ssl/lib:$LD_LIBRARY_PATH



    在Python交互环境中,执行以下代码来查看Python中使用的OpenSSL库的路径:

    1. import ssl
    2. print(ssl.OPENSSL_VERSION)
    3. print(ssl._ssl.__file__)


    我这边测试,无论怎么改LD_LIBRARY_PATH,一直引用的python安装目录下的: lib/python3.8/lib-dynload/_ssl.cpython-38-x86_64-linux-gnu.so
     

  • 相关阅读:
    采购管控: 缩短采购周期,从源头上降本增效
    目标检测YOLO实战应用案例100讲-基于无人机的轻量化目标检测系统设计
    关于JDK8中的字符串常量池和String.intern()方法理解
    腾讯吴运声:腾讯云+AI助力中国天眼FAST发现22颗新脉冲星
    位运算及其应用
    Effective Java学习笔记---------异常
    提升协作效率:钉钉流程与低代码平台的无缝对接
    C++11新特性③ | 可变参数模板介绍
    【c#】前后端分离练习小项目学习笔记----纯干货
    Rust(1) 简介和安装
  • 原文地址:https://blog.csdn.net/h952520296/article/details/132754787