欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決python報錯ImportError:urllib3?v2.0?only?supports?OpenSSL?1.1.1+

 更新時間:2023年12月05日 10:21:22   作者:西京刀客  
這篇文章主要介紹了解決python報錯ImportError:urllib3?v2.0?only?supports?OpenSSL?1.1.1+的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

一、問題描述

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 報錯

如果你已經(jīng)確認系統(tǒng)中的OpenSSL顯示為新版本,但Python仍然使用舊版本,可能是因為Python解釋器沒有正確鏈接到新版本的OpenSSL。

思路1: 重新編譯python

重新編譯Python是一種解決Python解釋器沒有正確鏈接到新版本OpenSSL的方法之一。這可以確保Python使用新版本的OpenSSL庫。

配置編譯選項:打開命令行終端,切換到Python源代碼的目錄,并運行以下命令以配置編譯選項:

./configure --with-openssl=/path/to/openssl
  • –with-ssl:表示使用了系統(tǒng)中已安裝的 OpenSSL 庫。
  • –with-openssl:表示使用了自帶的 OpenSSL 庫。

將 /path/to/openssl 替換為新版本OpenSSL庫的安裝路徑。此選項告訴Python編譯器在編譯過程中使用新版本的OpenSSL。

編譯和安裝:在命令行終端中運行以下命令以編譯和安裝重新配置的Python:

make
sudo make install

這將編譯Python源代碼并將其安裝到系統(tǒng)中。注意,在執(zhí)行sudo make install時,可能需要輸入管理員密碼。

驗證安裝結(jié)果:重新編譯和安裝完成后,你可以通過運行以下命令來驗證Python解釋器是否鏈接到了新版本的OpenSSL:

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

使用 --with-openssl 親測可用!推薦~

思路2: 指定Python解釋器鏈接到新版本的OpenSSL,而不重新編譯Python

如果你已經(jīng)安裝了新版本的OpenSSL,并且希望指定Python解釋器鏈接到該新版本的OpenSSL,而不重新編譯Python,可以通過設(shè)置環(huán)境變量LD_LIBRARY_PATH(Linux)或DYLD_LIBRARY_PATH(macOS),將新版本的OpenSSL庫路徑添加到Python解釋器的運行環(huán)境中。

例如,假設(shè)新版本的OpenSSL庫位于 /usr/local/ssl/lib,你可以執(zhí)行以下操作:

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

在Python交互環(huán)境中,執(zhí)行以下代碼來查看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的關(guān)系?每次openssl爆漏洞,我也需要編譯升級python么?

Python與OpenSSL之間存在緊密的關(guān)系。OpenSSL是一個開源的密碼學(xué)庫,提供了實現(xiàn)SSL/TLS協(xié)議和加密算法的功能。Python的SSL模塊則是構(gòu)建在OpenSSL庫之上的,它提供了對SSL/TLS協(xié)議的支持,使得Python程序能夠進行安全的網(wǎng)絡(luò)通信、加密解密等操作。

通常情況下,只需要升級OpenSSL本身即可,Python的SSL模塊將自動使用最新版本的OpenSSL庫。你無需重新編譯Python,只需確保你系統(tǒng)中已經(jīng)安裝了更新后的OpenSSL庫,Python將自動鏈接并使用該庫。

  • Python的SSL模塊是通過調(diào)用操作系統(tǒng)提供的動態(tài)鏈接庫(或共享庫)來實現(xiàn)其功能的。這些動態(tài)鏈接庫包含了SSL/TLS協(xié)議和加密算法的實現(xiàn)。在大多數(shù)操作系統(tǒng)中,OpenSSL庫被視為系統(tǒng)級庫,因此Python的SSL模塊會默認鏈接到操作系統(tǒng)中已安裝的OpenSSL庫。

  • 當你在系統(tǒng)中升級OpenSSL庫時,通常會更新相應(yīng)的動態(tài)鏈接庫文件。這意味著Python的SSL模塊可以自動從已更新的動態(tài)鏈接庫中加載最新版本的OpenSSL功能。

  • Python的SSL模塊在運行時會動態(tài)加載所需的OpenSSL函數(shù)和符號。它會查找操作系統(tǒng)的動態(tài)鏈接庫搜索路徑,以尋找和加載正確版本的OpenSSL庫。如果新版本的OpenSSL庫存在于系統(tǒng)的動態(tài)庫搜索路徑中,Python的SSL模塊將自動鏈接并使用該庫。

需要注意的是,上述自動鏈接和使用最新版本的OpenSSL庫僅適用于使用操作系統(tǒng)提供的Python分發(fā)版本。如果你使用的是自行編譯的Python,那么在編譯和安裝Python時需要確保正確地鏈接到更新后的OpenSSL庫。

如果你使用的是源代碼包,可以通過在運行./configure命令時傳遞–with-openssl參數(shù),并指定新版本的OpenSSL庫所在的路徑來配置Python的編譯選項。例如:

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

通過設(shè)置 LD_LIBRARY_PATH 環(huán)境變量,你可以指定 OpenSSL 庫的搜索路徑,而無需重新編譯 Python。但這種方法僅對于運行時鏈接到 OpenSSL 的應(yīng)用程序有效,如果 Python 在靜態(tài)鏈接時已經(jīng)鏈接到舊版本的 OpenSSL,那么這種方法可能無效。

如果 Python 是在靜態(tài)鏈接時與舊版本的 OpenSSL 相關(guān)聯(lián),那么僅通過設(shè)置 LD_LIBRARY_PATH 環(huán)境變量可能無法使 Python 使用新版本的 OpenSSL。

在靜態(tài)鏈接的情況下,編譯時會將 OpenSSL 的代碼和函數(shù)嵌入到生成的可執(zhí)行文件中,而不是在運行時動態(tài)加載。這意味著無論設(shè)置 LD_LIBRARY_PATH 環(huán)境變量如何,Python 仍然會使用已經(jīng)嵌入的舊版本 OpenSSL 的功能。

進入 Python 安裝目錄,查找名為 libpython*.a 的文件。例如,對于 Python 3.8,文件名可能是 libpython3.8.a。

 find / -name libpython*.a

如果你找到了這個文件,那么 Python 是靜態(tài)鏈接到 OpenSSL 的。如果沒有找到該文件,那么 Python 是在運行時動態(tài)鏈接到 OpenSSL 的。

如果發(fā)現(xiàn) Python 是靜態(tài)鏈接到 OpenSSL 的,那么僅通過設(shè)置 LD_LIBRARY_PATH 環(huán)境變量可能無法使 Python 使用新版本的 OpenSSL。在這種情況下,你可能需要重新編譯 Python 并鏈接到新版本的 OpenSSL,以確保 Python 使用最新的 OpenSSL 功能。

五、python怎么決定是動態(tài)還是靜態(tài)鏈接到openssl的?

在大多數(shù)情況下,Python 是通過動態(tài)鏈接的方式與 OpenSSL 相關(guān)聯(lián)。這意味著 Python 在運行時會從系統(tǒng)中加載所需的 OpenSSL 動態(tài)庫。

但是,有一些特殊情況可能導(dǎo)致 Python 靜態(tài)鏈接到 OpenSSL:

自定義編譯:如果你使用自定義的編譯選項或手動編譯 Python,可能會導(dǎo)致靜態(tài)鏈接到 OpenSSL。在這種情況下,你需要檢查編譯過程中的選項,并確認是否啟用了靜態(tài)鏈接。

檢查 Python 編譯過程中是否啟用了靜態(tài)鏈接的選項

進入 Python 安裝目錄,通常是 /usr/local/或/usr/ 中的 bin 目錄,路徑類似 /usr/local/bin/ 或 /usr/bin/

執(zhí)行以下命令來查看編譯選項:

./python3-config --ldflags

這個命令將顯示編譯 Python 時使用的鏈接器標志。

如果在輸出中看到了 -lssl 或 -lcrypto,則表示 Python 在編譯時啟用了 OpenSSL 鏈接。這意味著 Python 是通過動態(tài)鏈接方式與 OpenSSL 關(guān)聯(lián),而不是靜態(tài)鏈接。

如果在輸出中看到了 -l:libssl.a 或 -l:libcrypto.a,則表示 Python 在編譯時啟用了靜態(tài)鏈接。這意味著 Python 是通過靜態(tài)鏈接方式與 OpenSSL 關(guān)聯(lián)。

確定Python到底使用了哪個OpenSSL庫

在Python交互環(huán)境中,執(zhí)行以下代碼來查看Python中使用的OpenSSL庫的路徑:

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

這將打印出Python使用的OpenSSL版本以及實際加載的庫文件路徑。

系統(tǒng)中安裝了多個libssl庫版本。這可能導(dǎo)致Python解釋器無法正確鏈接到所需的libssl庫。

可以執(zhí)行以下命令來檢查libssl庫是否安裝:

 ldconfig -p | grep libssl

六、編譯python3.8 報錯:Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host()

編譯python3.8 報錯:Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().
LibreSSL 2.6.4 and earlier do not provide the necessary APIs, https://github.com/libressl-portable/portable/issues/381

問題分析:
我本地的openssl已經(jīng)更新了,但是還是報這個錯,甚至我使用python編譯選項指定我opensslssl的路徑也不行 --with-openssl=/usr/local/my_openssl/lib/

需要確認安裝的OpenSSL是否在編譯時添加了enable-ssl3配置

./config enable-ssl3 shared --prefix=/usr/local/openssl
make
sudo make install

在編譯OpenSSL時添加enable-ssl3配置的原因是:

OpenSSL 1.1.0 版本之后,默認禁用了SSLv3協(xié)議,只支持TLSv1.0及以上版本。但Python在構(gòu)建ssl模塊時,仍然需要SSLv3的支持。所以在編譯OpenSSL時需要顯式添加enable-ssl3配置來啟用SSLv3協(xié)議。

如果不添加這個配置,編譯Python時會出現(xiàn)您遇到的錯誤:

Could not build the ssl module! 
Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().

這是因為Python試圖調(diào)用OpenSSL的X509_VERIFY_PARAM_set1_host()函數(shù),但這個函數(shù)是在OpenSSL 1.0.2版本引入的。而默認編譯的OpenSSL 1.1.0及以上版本又禁用了SSLv3,所以Python無法構(gòu)建ssl模塊。

  • 它會啟用SSLv3協(xié)議,這樣Python可以調(diào)用OpenSSL的SSLv3相關(guān)函數(shù)來構(gòu)建ssl模塊。
  • 它會構(gòu)建OpenSSL的早期兼容版本,這樣Python可以調(diào)用像X509_VERIFY_PARAM_set1_host()這樣的函數(shù)。

注意 python編譯參數(shù)的 應(yīng)該使用--with-openssl=/usr/local/openssl來指定OpenSSL的主目錄, 而不是子目錄如lib。Python的configure腳本會在該路徑下自動搜索include子目錄和lib子目錄。

親測通過!

總結(jié)

到此這篇關(guān)于解決python報錯ImportError:urllib3 v2.0 only supports OpenSSL 1.1.1+的文章就介紹到這了,更多相關(guān)python報錯ImportError內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Conda環(huán)境導(dǎo)出與導(dǎo)入的實現(xiàn)

    Conda環(huán)境導(dǎo)出與導(dǎo)入的實現(xiàn)

    本文主要介紹了Conda環(huán)境導(dǎo)出與導(dǎo)入的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • java直接調(diào)用python腳本的例子

    java直接調(diào)用python腳本的例子

    有時需求使用JAVA直接調(diào)用python腳本,執(zhí)行一些服務(wù)器監(jiān)控的事情。 本文給出一個java直接調(diào)用python腳本的例子
    2014-02-02
  • Python實現(xiàn)json對值進行模糊搜索的示例詳解

    Python實現(xiàn)json對值進行模糊搜索的示例詳解

    我經(jīng)常使用json進行存儲配置,于是常常遇到這樣的問題:如果想要對某個數(shù)組里的值進行模糊搜索,同時輸出相關(guān)的其他數(shù)組相同位置的的值該如何實現(xiàn)呢?本文就來和大家詳細聊聊
    2023-01-01
  • 使用Python生成條形碼圖片的實戰(zhàn)代碼

    使用Python生成條形碼圖片的實戰(zhàn)代碼

    在自動化生產(chǎn)、物流配送、商超系統(tǒng)等日常業(yè)務(wù)中,條形碼已成為數(shù)據(jù)快速讀取與追蹤的核心方式,相比手工設(shè)計,使用 Python 編程生成條形碼圖片,能顯著提升效率并支持批量處理,本文將介紹如何使用Python生成條形碼,需要的朋友可以參考下
    2025-05-05
  • 在Python 的線程中運行協(xié)程的方法

    在Python 的線程中運行協(xié)程的方法

    這篇文章主要介紹了在Python 的線程中運行協(xié)程的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • 徹底解決No?module?named?‘torch_geometric‘報錯的辦法

    徹底解決No?module?named?‘torch_geometric‘報錯的辦法

    這篇文章主要給大家介紹了關(guān)于如何徹底解決No?module?named?‘torch_geometric‘報錯的辦法,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-03-03
  • django+js+ajax實現(xiàn)刷新頁面的方法

    django+js+ajax實現(xiàn)刷新頁面的方法

    這篇文章主要介紹了django+js+ajax實現(xiàn)刷新頁面的方法,結(jié)合實例形式分析了django實現(xiàn)ajax刷新頁面功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • Python函數(shù)式編程指南(四):生成器詳解

    Python函數(shù)式編程指南(四):生成器詳解

    這篇文章主要介紹了Python函數(shù)式編程指南(四):生成器詳解,本文講解了生成器簡介、生成器函數(shù)、生成器函數(shù)的FAQ等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • 基于python 爬蟲爬到含空格的url的處理方法

    基于python 爬蟲爬到含空格的url的處理方法

    今天小編就為大家分享一篇基于python 爬蟲爬到含空格的url的處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python實現(xiàn)加解密,編碼解碼和進制轉(zhuǎn)換(最全版)

    Python實現(xiàn)加解密,編碼解碼和進制轉(zhuǎn)換(最全版)

    這篇文章主要為大家詳細介紹了Python實現(xiàn)加解密、編碼解碼、進制轉(zhuǎn)換、字符串轉(zhuǎn)換的最全版操作方法,文中的示例代碼講解詳細,大家可以收藏一下
    2023-01-01

最新評論