python报错:ImportError urllib3 v2

文章目录

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

一、问题描述

python3 安装了requests (pip install requests

二、问题分析

说明: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

wget --no-check-certificate   https://www.openssl.org/source/openssl-1.1.1t.tar.gz
tar -zxvf openssl-1.1.1t.tar.gz
cd openssl-1.1.1t/
./config --prefix=/usr/local/my_openssl
make
make install

tar -zxf ./my_openssl.tar.gz -C /usr/local
echo "copy my\_openssl done"
sleep 1

mv /usr/bin/openssl /usr/bin/oldopenssl
ln -s /usr/local/my_openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/my_openssl/lib/libssl.so.1.1 /usr/lib64/
ln -s /usr/local/my_openssl/lib/libcrypto.so.1.1  /usr/lib64/
echo "change openssl done"

升级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
sudo 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

四、python编译和openssl的关系?每次openssl爆漏洞,我也需要编译升级python么?

Python与OpenSSL之间存在紧密的关系。OpenSSL是一个开源的密码学库,提供了实现SSL/TLS协议和加密算法的功能。Python的SSL模块则是构建在OpenSSL库之上的,它提供了对SSL/TLS协议的支持,使得Python程序能够进行安全的网络通信、加密解密等操作。

通常情况下,只需要升级OpenSSL本身即可,Python的SSL模块将自动使用最新版本的OpenSSL库。你无需重新编译Python,只需确保你系统中已经安装了更新后的OpenSSL库,Python将自动链接并使用该库。

  1. Python的SSL模块是通过调用操作系统提供的动态链接库(或共享库)来实现其功能的。这些动态链接库包含了SSL/TLS协议和加密算法的实现。在大多数操作系统中,OpenSSL库被视为系统级库,因此Python的SSL模块会默认链接到操作系统中已安装的OpenSSL库。
  2. 当你在系统中升级OpenSSL库时,通常会更新相应的动态链接库文件。这意味着Python的SSL模块可以自动从已更新的动态链接库中加载最新版本的OpenSSL功能。
  3. Python的SSL模块在运行时会动态加载所需的OpenSSL函数和符号。它会查找操作系统的动态链接库搜索路径,以寻找和加载正确版本的OpenSSL库。如果新版本的OpenSSL库存在于系统的动态库搜索路径中,Python的SSL模块将自动链接并使用该库。

需要注意的是,上述自动链接和使用最新版本的OpenSSL库仅适用于使用操作系统提供的Python分发版本。如果你使用的是自行编译的Python,那么在编译和安装Python时需要确保正确地链接到更新后的OpenSSL库。

如果你使用的是源代码包,可以通过在运行./configure命令时传递–with-openssl参数,并指定新版本的OpenSSL库所在的路径来配置Python的编译选项。例如:

./configure --with-openssl=/path/to/new/openssl

通过设置 LD_LIBRARY_PATH 环境变量,你可以指定 OpenSSL 库的搜索路径,而无需重新编译 Python。但这种方法仅对于运行时链接到 OpenSSL 的应用程序有效,如果 Python 在静态链接时已经链接到旧版本的 OpenSSL,那么这种方法可能无效。

如果 Python 是在静态链接时与旧版本的 OpenSSL 相关联,那么仅通过设置 LD_LIBRARY_PATH 环境变量可能无法使 Python 使用新版本的 OpenSSL。

在静态链接的情况下,编译时会将 OpenSSL 的代码和函数嵌入到生成的可执行文件中,而不是在运行时动态加载。这意味着无论设置 LD_LIBRARY_PATH 环境变量如何,Python 仍然会使用已经嵌入的旧版本 OpenSSL 的功能。

进入 Python 安装目录,查找名为 libpython*.a 的文件。例如,对于 Python 3.8,文件名可能是 libpython3.8.a。

 find / -name libpython*.a

如果你找到了这个文件,那么 Python 是静态链接到 OpenSSL 的。如果没有找到该文件,那么 Python 是在运行时动态链接到 OpenSSL 的。

如果发现 Python 是静态链接到 OpenSSL 的,那么仅通过设置 LD_LIBRARY_PATH 环境变量可能无法使 Python 使用新版本的 OpenSSL。在这种情况下,你可能需要重新编译 Python 并链接到新版本的 OpenSSL,以确保 Python 使用最新的 OpenSSL 功能。

五、python怎么决定是动态还是静态链接到openssl的?

在大多数情况下,Python 是通过动态链接的方式与 OpenSSL 相关联。这意味着 Python 在运行时会从系统中加载所需的 OpenSSL 动态库。

但是,有一些特殊情况可能导致 Python 静态链接到 OpenSSL:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

g.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

img
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值