最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決python報(bào)錯(cuò)ImportError:urllib3?v2.0?only?supports?OpenSSL?1.1.1+

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

一、問(wèn)題描述

python3 安裝了requests (pip install requests

二、問(wèn)題分析

說(shuō)明:requests包引入了urllib3,而新版本的urllib3 需要OpenSSL 1.1.1+以上版本,否則報(bào)錯(cuò):

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

三、解決方法

需要升級(jí)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"

升級(jí)openssl之后,依舊import urllib3 報(bào)錯(cuò)

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

思路1: 重新編譯python

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

配置編譯選項(xiàng):打開(kāi)命令行終端,切換到Python源代碼的目錄,并運(yùn)行以下命令以配置編譯選項(xiàng):

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

將 /path/to/openssl 替換為新版本OpenSSL庫(kù)的安裝路徑。此選項(xiàng)告訴Python編譯器在編譯過(guò)程中使用新版本的OpenSSL。

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

make
sudo make install

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

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

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

使用 --with-openssl 親測(cè)可用!推薦~

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

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

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

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

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

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

我這邊測(cè)試,無(wú)論怎么改LD_LIBRARY_PATH,一直引用的python安裝目錄下的: lib/python3.8/lib-dynload/_ssl.cpython-38-x86_64-linux-gnu.so

四、python編譯和openssl的關(guān)系?每次openssl爆漏洞,我也需要編譯升級(jí)python么?

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

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

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

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

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

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

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

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

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

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

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

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

 find / -name libpython*.a

如果你找到了這個(gè)文件,那么 Python 是靜態(tài)鏈接到 OpenSSL 的。如果沒(méi)有找到該文件,那么 Python 是在運(yùn)行時(shí)動(dòng)態(tài)鏈接到 OpenSSL 的。

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

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

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

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

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

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

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

執(zhí)行以下命令來(lái)查看編譯選項(xiàng):

./python3-config --ldflags

這個(gè)命令將顯示編譯 Python 時(shí)使用的鏈接器標(biāo)志。

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

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

確定Python到底使用了哪個(gè)OpenSSL庫(kù)

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

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

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

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

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

 ldconfig -p | grep libssl

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

編譯python3.8 報(bào)錯(cuò):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

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

需要確認(rèn)安裝的OpenSSL是否在編譯時(shí)添加了enable-ssl3配置

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

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

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

如果不添加這個(gè)配置,編譯Python時(shí)會(huì)出現(xiàn)您遇到的錯(cuò)誤:

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

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

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

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

親測(cè)通過(guò)!

總結(jié)

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

相關(guān)文章

  • Django Sitemap 站點(diǎn)地圖的實(shí)現(xiàn)方法

    Django Sitemap 站點(diǎn)地圖的實(shí)現(xiàn)方法

    這篇文章主要介紹了Django Sitemap 站點(diǎn)地圖的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 初學(xué)者快看,Python下劃線的五個(gè)作用介紹

    初學(xué)者快看,Python下劃線的五個(gè)作用介紹

    大家好,本篇文章主要講的是初學(xué)者快看,Python下劃線的五個(gè)作用介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Python中reduce()函數(shù)的用法詳細(xì)解讀

    Python中reduce()函數(shù)的用法詳細(xì)解讀

    這篇文章主要介紹了Python中reduce()函數(shù)的用法詳細(xì)解讀,reduce函數(shù)是通過(guò)函數(shù)對(duì)迭代器對(duì)象中的元素進(jìn)行遍歷操作,但需要注意的是?reduce?函數(shù)返回的是計(jì)算的結(jié)果,而?map/filter?返回的是作用后的迭代器對(duì)象,需要的朋友可以參考下
    2023-08-08
  • python logging模塊的使用總結(jié)

    python logging模塊的使用總結(jié)

    這篇文章主要介紹了python logging模塊使用總結(jié)以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。,需要的朋友可以參考下
    2019-07-07
  • Matplotlib自定義坐標(biāo)刻度的使用示例

    Matplotlib自定義坐標(biāo)刻度的使用示例

    雖然matplotlib默認(rèn)的坐標(biāo)軸定位器與格式生成器可以滿足大部分需求,但是并非對(duì)每一幅圖都合適,本文主要介紹了Matplotlib自定義坐標(biāo)刻度的使用示例,感興趣的可以了解一下
    2023-11-11
  • Java與Python兩大幸存者誰(shuí)更勝一籌呢

    Java與Python兩大幸存者誰(shuí)更勝一籌呢

    Python起源于一種腳本語(yǔ)言,它的語(yǔ)法體現(xiàn)了一種可讀性的理念,具有簡(jiǎn)單而規(guī)則的界限,鼓勵(lì)簡(jiǎn)潔和一致的代碼布局,而Java是一種面向?qū)ο笳Z(yǔ)言,其吸引力和價(jià)值所在是其具有的可移植性和相對(duì)效率。下面通過(guò)本文了解下java python 誰(shuí)更勝一籌
    2018-04-04
  • 使用NumPy和pandas對(duì)CSV文件進(jìn)行寫操作的實(shí)例

    使用NumPy和pandas對(duì)CSV文件進(jìn)行寫操作的實(shí)例

    今天小編就為大家分享一篇使用NumPy和pandas對(duì)CSV文件進(jìn)行寫操作的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Python中高級(jí)語(yǔ)法糖的使用示例詳解

    Python中高級(jí)語(yǔ)法糖的使用示例詳解

    Python?是一門簡(jiǎn)潔而強(qiáng)大的編程語(yǔ)言,具備許多高級(jí)語(yǔ)法糖(syntactic?sugar)功能,本文將介紹一些常見(jiàn)的Python高級(jí)語(yǔ)法糖,以及如何使用它們來(lái)提高代碼質(zhì)量和開(kāi)發(fā)效率,需要的小伙伴可以參考下
    2024-01-01
  • Python實(shí)現(xiàn)的計(jì)算馬氏距離算法示例

    Python實(shí)現(xiàn)的計(jì)算馬氏距離算法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的計(jì)算馬氏距離算法,簡(jiǎn)單說(shuō)明了馬氏距離算法原理,并結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)與使用馬氏距離算法的相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • LRUCache的實(shí)現(xiàn)原理及利用python實(shí)現(xiàn)的方法

    LRUCache的實(shí)現(xiàn)原理及利用python實(shí)現(xiàn)的方法

    LruCache 是 Android 的一個(gè)內(nèi)部類,提供了基于內(nèi)存實(shí)現(xiàn)的緩存,而下面這篇文章主要給大家介紹了關(guān)于LRUCache的實(shí)現(xiàn)原理以及利用python實(shí)現(xiàn)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-11-11

最新評(píng)論

甘肃省| 惠来县| 铜梁县| 内黄县| 宜兰县| 扶风县| 铅山县| 宝兴县| 温泉县| 屏东市| 涞水县| 蛟河市| 赤峰市| 甘谷县| 沙湾县| 文化| 天镇县| 上高县| 新巴尔虎左旗| 临城县| 水城县| 株洲县| 浮梁县| 武清区| 武鸣县| 普格县| 巴林右旗| 荣昌县| 泽州县| 汨罗市| 湘潭县| 海丰县| 巴林左旗| 华坪县| 东乌珠穆沁旗| 延寿县| 巴南区| 甘泉县| 达孜县| 丁青县| 诏安县|