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. 依赖包
安装编译 OpenSSL 所需的包,包括 gcc、make、perl 和 zlib-devel。可以通过运行以下命令完成:
yum install -y gcc make perl zlib-devel

2. 安装包下载
下载 OpenSSL 1.1.1 的源码包,可以从 OpenSSL 官网下载(https://www.openssl.org/source/openssl-1.1.1.tar.gz)或使用以下命令下载:
wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
3. 解压
解压源码包并进入解压后的目录:
tar -zxvf openssl-1.1.1.tar.gz
cd openssl-1.1.1  

4.初始化并编译、安装
运行以下命令编译 OpenSSL:
./config   --prefix=/opt/openssl-1.1.1

make
make install

5. 添加环境变量
vim /etc/profile
 export PATH=/opt/openssl-1.1.1/bin:$PATH
 export LD_LIBRARY_PATH=/opt/openssl-1.1.1/lib:$LD_LIBRARY_PATH

source /etc/profile

这会在系统中安装新的 OpenSSL 版本。可以通过运行以下命令检查 OpenSSL 版本:
openssl version

如果输出结果中的版本号为 1.1.1 或更高版本,则说明 OpenSSL 已成功升级。

6. 做软连接
如果还是原来的版本,没变成新版本,可以做软连接使其挂用新版本  
将原来的openssl,做备份
mv /usr/bin/openssl     /usr/bin/openssl_20230525bak
mv /usr/lib64/openssl   /usr/lib64/openssl_20230525bak
然后将新安装的OpenSSL做软连接到这个路径
ln  -s  /opt/openssl-1.1.1/bin/openssl   /usr/bin/openssl

再执行以下命令检查 OpenSSL 版本:
openssl version

完成!!

升级openssl之后,依旧import urllib3 报错

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

思路1: 重新编译python

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

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

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

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

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

make
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库的路径:

import ssl
print(ssl.OPENSSL_VERSION)
print(ssl._ssl.__file__)

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

相关推荐
秃头佛爷25 分钟前
Python学习大纲总结及注意事项
开发语言·python·学习
待磨的钝刨26 分钟前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
深度学习lover1 小时前
<项目代码>YOLOv8 苹果腐烂识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·苹果腐烂识别
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
API快乐传递者2 小时前
淘宝反爬虫机制的主要手段有哪些?
爬虫·python
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉4 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer4 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
阡之尘埃4 小时前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控