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

相关推荐
InfinteJustice24 分钟前
踩坑分享C 语言文件操作全攻略:从基础读写到随机访问与缓冲区原理
c语言·开发语言·microsoft
码云数智-大飞27 分钟前
滥用Lombok的@EqualsAndHashCode导致线上事故复盘
开发语言
yong999028 分钟前
C# 实时查看硬件使用率(CPU 内存 硬盘 网络)
开发语言·网络·c#
不午休の野猫1 小时前
vs + qt环境编译.sln项目时报无法解析的外部符号metaObject && qt_metacast
开发语言·qt
2301_795099741 小时前
如何优化SQL中大批量数据的物理删除_分批次与间隔控制
jvm·数据库·python
阿kun要赚马内1 小时前
后端数据操作组合:Pydantic与ORM
后端·python·orm·sqlalchemy
2301_812539671 小时前
CSS如何引入CSS形状生成器_通过自定义属性实现图形化样式
jvm·数据库·python
吴声子夜歌1 小时前
Java——接口的细节
java·开发语言·算法
阿拉金alakin1 小时前
深入理解 Java 锁机制:CAS 原理、synchronized 优化与主流锁策略全总结
java·开发语言
myheartgo-on1 小时前
Java—方 法
java·开发语言·算法·青少年编程