解决urllib3 v2.0只支持OpenSSL 1.1.1+导致的ImportError异常
2024-03-01 14:15:11
urllib3 是一个非常流行和强大的 Python HTTP 库,它可以帮助我们轻松地处理网络请求和响应。然而,有时候我们在使用 urllib3 v2.0 这个版本时,会遇到 ImportError 异常,提示我们当前的 'ssl' 模块是用 LibreSSL 编译的,而不是 OpenSSL。这是因为 urllib3 v2.0 只支持 OpenSSL 1.1.1+,而 LibreSSL 是一个 OpenSSL 的分支,但是它不完全兼容 OpenSSL 的新特性。这个异常可能会导致我们无法正常地使用 pip 安装某些库或者运行某些 Python 程序。
在本文中,我将为您解答这个异常的原因和解决方法,并提供一些常见问题解答。让我们一起来看看吧。
什么是 OpenSSL 和 LibreSSL?
OpenSSL 是一个开源的软件库,它提供了一系列的加密和安全功能,比如 SSL(Secure Sockets Layer)和 TLS(Transport Layer Security)协议。SSL 和 TLS 协议可以在客户端和服务器之间建立一个加密的通信信道,保证数据的完整性和机密性。OpenSSL 库被广泛地应用在各种网络应用中,比如浏览器、邮件客户端、聊天软件等。
LibreSSL 是一个 OpenSSL 的分支,它由 OpenBSD 项目发起,目的是修复 OpenSSL 中存在的一些安全漏洞和设计缺陷,并且提供一个更简洁和更可靠的代码库。LibreSSL 保持了对 OpenSSL 的兼容性,但是它也引入了一些新的特性和改进,比如更强的加密算法、更好的随机数生成器、更少的内存泄漏等。
为什么 urllib3 v2.0 只支持 OpenSSL 1.1.1+?
urllib3 v2.0 是 urllib3 库的最新版本,它于 2022 年 5 月发布。urllib3 v2.0 带来了一些新的特性和改进,比如:
- 支持 HTTP/2 协议
- 支持 TLSv1.3 协议
- 支持 ALPN(Application-Layer Protocol Negotiation)协议
- 支持 SNI(Server Name Indication)扩展
- 支持 OCSP(Online Certificate Status Protocol)扩展
- 支持 HPKP(HTTP Public Key Pinning)扩展
- 支持 HSTS(HTTP Strict Transport Security)扩展
- 支持 CSP(Content Security Policy)扩展
- 支持 CT(Certificate Transparency)扩展
- 支持 RFC 8446 中定义的新密码套件
这些新的特性和改进都依赖于 OpenSSL 1.1.1+ 提供的功能,因此 urllib3 v2.0 要求使用 OpenSSL 1.1.1+ 来编译 'ssl' 模块。如果使用低于 1.1.1 的 OpenSSL 版本或者使用 LibreSSL 来编译 'ssl' 模块,那么 urllib3 v2.0 就无法正常工作,并且会抛出 ImportError 异常。
如何解决 urllib3 v2.0 只支持 OpenSSL 1.1.1+ 的 ImportError 异常?
针对不同的原因,我们可以尝试以下几种方法来解决 urllib3 v2.0 只支持 OpenSSL 1.1.1+ 的 ImportError 异常:
方法一:升级您的 OpenSSL 版本
如果您使用的是 Mac OS 系统,您可以使用 brew 命令来升级您的 OpenSSL 版本。例如:
brew install openssl@1.1
这样就可以安装最新版的 OpenSSL,并且替换掉旧版的 LibreSSL。
如果您使用的是其他系统,您可以参考 OpenSSL 的官方网站(https://www.openssl.org/source/)来下载和安装最新版的 OpenSSL。
方法二:降级您的 urllib3 版本
如果您无法或者不想升级您的 OpenSSL 版本,您可以尝试降级您的 urllib3 版本,以适配您当前的 OpenSSL 版本。例如,您可以使用以下命令来安装 urllib3 v1.26.6 这个版本:
pip install urllib3==1.26.6
这样就可以避免 urllib3 v2.0 对 OpenSSL 1.1.1+ 的要求。
方法三:修改 urllib3 库的源码
如果以上方法都无法解决问题,那么可能是由于 urllib3 库在检查 OpenSSL 版本时没有考虑到 LibreSSL 的情况。因此,我们可以手动地修改 urllib3 库的源码,让它忽略 LibreSSL 的版本。具体步骤如下:
- 找到 urllib3 库所在的目录(一般在 Python 安装目录下的 site-packages 目录中),并打开 util 目录。
- 在 util 目录中找到 ssl_.py 这个文件,并打开它。
- 在文件中找到以下这段代码:
if ssl.OPENSSL_VERSION_INFO < (1, 1, 1):
raise ImportError(
"urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with "
+ ssl.OPENSSL_VERSION
+ ". See: https://github.com/urllib3/urllib3/issues/2168"
)
- 将这段代码注释掉或者删除掉。
- 保存并关闭文件。
- 重新尝试 pip 安装或者运行 Python 程序。
结论
urllib3 v2.0 只支持 OpenSSL 1.1.1+ 的 ImportError 异常是一个比较常见的问题,它可能会影响我们使用 pip 安装某些库或者运行某些 Python 程序。这个异常的原因是 urllib3 v2.0 依赖于 OpenSSL 1.1.1+ 提供的一些新特性,而我们当前的 'ssl' 模块是用 LibreSSL 编译的,而 LibreSSL 不完全兼容 OpenSSL 的新特性。为了解决这个问题,我们可以尝试升级我们的 OpenSSL 版本、降级我们的 urllib3 版本或者修改我们的 urllib3 库的源码。希望本文能够帮助您成功地使用 urllib3 v2.0 这个版本。
常见问题解答
Q: 我如何知道我是否遇到了 ImportError 异常?
A: 如果您在使用 pip 安装某个库或者运行某个 Python 程序时,看到类似这样的错误信息:
ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with LibreSSL 2.8.3
那么您可能遇到了 ImportError 异常。
Q: 我如何检查我的 'ssl' 模块是用什么编译的?
A: 您可以使用以下命令来检查您的 'ssl' 模块是用什么编译的:
python -c "import ssl; print(ssl.OPENSSL_VERSION)"
这个命令会输出您的 'ssl' 模块使用的 OpenSSL 或者 LibreSSL 的版本信息。
Q: 我如何升级或者降级我的 pip 版本?
A: 您可以使用以下命令来升级或者降级您的 pip 版本:
pip install --upgrade pip
pip install pip==<version>
其中 是您想要安装的 pip 的版本号,比如 21.1.2。
Q: 我如何升级或者降级我的 urllib3 版本?
A: 您可以使用以下命令来升级或者降级您的 urllib3 版本:
pip install --upgrade urllib3
pip install urllib3==<version>
其中 是您想要安装的 urllib3 的版本号,比如 1.26.6。
Q: 我如何升级或者降级我的 OpenSSL 版本?
A: 这取决于您使用的操作系统和网络环境。一般来说,您可以在系统设置或者网络设置中找到相关的选项。如果您不确定如何操作,您可以咨询您的网络管理员或者搜索相关的教程。