国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python urllib3和requests發(fā)送HTTPS請求時出現(xiàn)SSLError或InsecureRequestWarning

這篇具有很好參考價值的文章主要介紹了Python urllib3和requests發(fā)送HTTPS請求時出現(xiàn)SSLError或InsecureRequestWarning。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

問題及原因分析

在我們通過urllib3和requests進行HTTPS請求時,可能會出現(xiàn)SSLError的錯誤:
示例1 找不到對應(yīng)的本地證書

Caused by SSLError(SSLCertVerificationError(1,
'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate

示例2 服務(wù)端證書過期

Caused by SSLError(SSLCertVerificationError(1, 
'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired

SSL為安全套接層,是HTTPS的安全基礎(chǔ)。當證書驗證失敗,urlib3和requests就會拋出SSL錯誤。
為什么證書會驗證失敗?這里要先說清楚HTTPS中證書的工作原理:

公鑰證書,是服務(wù)端提前向第三方機構(gòu)申請頒發(fā)的,由公鑰和數(shù)字簽名組成。服務(wù)端提供公鑰,第三方機構(gòu)則負責(zé)對公鑰做數(shù)字簽名(即用第三方機構(gòu)私鑰對服務(wù)端的公鑰加密)。
在HTTPS請求中,服務(wù)端會將自己的公鑰證書發(fā)送給客戶端,客戶端拿到公鑰證書后,需要憑借第三方機構(gòu)的公鑰(也稱為證書,一般會自帶在操作系統(tǒng)或瀏覽器中)去驗證數(shù)字簽名的有效性,驗證通過即可確認服務(wù)端公鑰為真實有效,然后通過公鑰進行安全的加密通信。

因此,證書驗證失敗,就是請求方無法驗證服務(wù)端公鑰證書的有效性,有兩種原因:
1.本地缺少對應(yīng)第三方機構(gòu)的公鑰(也稱為第三方機構(gòu)的證書)
2.服務(wù)端的公鑰證書有誤,可能已過期
第二種原因來自服務(wù)端,我們作為請求方無法解決,只能通過后面提到的方法忽略警告或不使用SSL層。
第一種則可通過下面的方法解決。

優(yōu)先考慮的解決方法:

下載證書

urllib3和requests在發(fā)送https請求時都會加載默認的系統(tǒng)證書,但更可靠的方法是安裝 Mozilla 提供的證書包。
可以直接到官方網(wǎng)站去下載,但更推薦安裝certifi包,方便以后更新:

python -m pip install certifi

安裝后可以通過certifi的方法查詢證書路徑

>>> import certifi

>>> certifi.where()
'F:\Anaconda\lib\site-packages\certifi\cacert.pem'

使用證書

urlib3:

指定證書路徑創(chuàng)建連接池:

http = urllib3.PoolManager(
    cert_reqs='CERT_REQUIRED',  //默認值,指證書必須驗證通過,否則拋出SSL錯誤
    ca_certs=certifi.where()   //指定證書路徑
)

連接池會使用指定路徑的證書,并在驗證失敗時拋出異常:

http.request('GET', 'https://google.com')
(No exception)
http.request('GET', 'https://expired.badssl.com')
urllib3.exceptions.SSLError ...

requests:

跟urblib3類似,只是指定證書方式有不同,通過verify參數(shù)來指定(路徑也可以直接用文件的絕對路徑):

requests.get('https://github.com', verify='F:\Anaconda\lib\site-packages\certifi\cacert.pem')

或者通過session全局指定:

s = requests.Session()
s.verify = 'F:\Anaconda\lib\site-packages\certifi\cacert.pem'
s.get('https://github.com')
(No exception)
s.get('https://expired.badssl.com')
urllib3.exceptions.SSLError ...

手動獲取證書

如果仍然請求失敗,但瀏覽器能正常訪問,那可以直接從瀏覽器導(dǎo)出證書來使用。以谷歌瀏覽器為例:
1.按順序?qū)С鲎C書
Python urllib3和requests發(fā)送HTTPS請求時出現(xiàn)SSLError或InsecureRequestWarningPython urllib3和requests發(fā)送HTTPS請求時出現(xiàn)SSLError或InsecureRequestWarning
Python urllib3和requests發(fā)送HTTPS請求時出現(xiàn)SSLError或InsecureRequestWarning
2.導(dǎo)出文件后,將文件中的公鑰復(fù)制到指定的證書路徑中即可Python urllib3和requests發(fā)送HTTPS請求時出現(xiàn)SSLError或InsecureRequestWarning

不推薦使用的備用解決方法:

強烈建議不要發(fā)出未經(jīng)驗證的 HTTPS 請求,因為HTTPS可以防止中間人攻擊(竊聽,偽裝,篡改等問題)。但如果確實無法解決證書問題,那可以關(guān)閉HTTPS請求中的SSL驗證,來解決該問題。

關(guān)閉方法

urllib3:
指定cert_reqs為CERT_NONE(默認為CERT_REQUIRED)

http = urllib3.PoolManager(
    cert_reqs = 'CERT_NONE'
)

requests:
指定verify為False(默認為True)

#單次關(guān)閉
requests.get('https://expired.badssl.com', verify=False)
<Response [200]>

#全局關(guān)閉
s = requests.Session()
s.verify = False

也可以通過SSL包來關(guān)閉(urllib3和requests通用)

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

衍生問題

關(guān)閉后便可以正常請求,但是會彈出InsecureRequestWarning的警告

InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.xxx.com'.
Adding certificate verification is strongly advised

如果了解風(fēng)險并希望禁用這些警告,可以使用以下方法(urllib3和requests通用):

import urllib3
urllib3.disable_warnings()

或者也可以使用logging標準模塊捕獲警告:

logging.captureWarnings(True)

最后,還可以通過設(shè)置環(huán)境變量PYTHONWARNINGS來限制該級別的警告 。

另外,上述方法也會同時禁用下列警告:
InsecurePlatformWarning
這發(fā)生在具有過時ssl模塊的 Python 2 平臺上。這些較舊的ssl模塊可能會導(dǎo)致一些不安全的請求在它們應(yīng)該失敗的時候成功,而安全的請求則會在它們應(yīng)該成功的地方失敗
SNIMissingWarning
這發(fā)生在早于 2.7.9 的 Python 2 版本上。這些舊版本缺乏SNI支持。這可能會導(dǎo)致服務(wù)器提供客戶端認為無效的證書
這兩個警告對應(yīng)問題的解決方法可以去官網(wǎng)文檔查看

參考文檔

urllib3: https://urllib3.readthedocs.io/en/1.26.x/user-guide.html#
request:https://requests.readthedocs.io/en/latest/user/advanced/文章來源地址http://www.zghlxwxcb.cn/news/detail-405772.html

到了這里,關(guān)于Python urllib3和requests發(fā)送HTTPS請求時出現(xiàn)SSLError或InsecureRequestWarning的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【解決】selenium和requests中urllib3版本沖突

    selenium要求urllibs版本為1.26,requests要求urllibs版本1.25,=1.21. 升級requests版本為最新版,就可以兼容。 在conda中安裝selenium報錯,urllib3版本出現(xiàn)錯誤。 然后安裝selenium 成功 查看selenium版本號 pip show selenium

    2024年02月11日
    瀏覽(15)
  • 【已解決】requests 和 selenium對 Urllib3版本沖突

    【已解決】requests 和 selenium對 Urllib3版本沖突

    requests對urllib3要求版本低于1.23,而selenium要求urllib3高于1.26,直接用pip install requests安裝的版本是舊的(1.20),最新的為1.28,同時會把你新版本的urllib3刪掉,換成1.23,于是無限死循環(huán)。。 解決辦法:下載最新版的requests 下載鏈接:https://pypi.org/project/requests/#files 隨后一番解壓

    2024年02月11日
    瀏覽(25)
  • Python3中urllib請求網(wǎng)頁報錯(AttributeError: module ‘urllib‘ has no attribute ‘request‘)

    Python3中urllib請求網(wǎng)頁報錯(AttributeError: module ‘urllib‘ has no attribute ‘request‘)

    報錯代碼 python3.8,想用urllib庫請求訪問貼吧,報錯代碼如下: 報錯信息:看到兩個request亮著,說明有問題 ? 運行后的報錯 報錯內(nèi)容翻譯: 屬性錯誤:模塊urllib模塊沒有屬性request 報錯原因: Python中出現(xiàn)AttributeError的錯誤主要有兩類原因: 1. 沒有引入對應(yīng)正確的包 2. 工程目

    2024年02月15日
    瀏覽(23)
  • python requests請求報錯Caused by SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED]

    解決方案如下: requests請求時關(guān)閉ssl驗證即可 添加參數(shù) verify=False

    2024年01月23日
    瀏覽(29)
  • 【python】(十九)python常用第三方庫——urllib3

    官方文檔:https://urllib3.readthedocs.io/en/stable/ Urllib3是一個功能強大,條理清晰,用于HTTP客戶端的Python庫,許多Python的原生系統(tǒng)已經(jīng)開始使用urllib3。Urllib3提供了很多python標準庫里所沒有的重要特性: 線程安全 連接池管理 客戶端 SSL/TLS 驗證 支持 HTTP 和 SOCKS 代理 …… 通過 pip

    2024年02月13日
    瀏覽(124)
  • python 模塊urllib3 HTTP 客戶端庫

    官網(wǎng)文檔地址:https://urllib3.readthedocs.io/en/stable/reference/index.html 一、安裝 二、基本使用 三、urllib3.request() 發(fā)送請求 四、urllib3.PoolManager() 創(chuàng)建和管理連接池,以便在發(fā)送多個 HTTP 請求時重用連接 http.request(method,url,body,fields,headers) 發(fā)送請求 method(字符串):指定請求的 HTTP 方

    2024年02月11日
    瀏覽(20)
  • Python+Requests模擬發(fā)送post請求

    Python+Requests模擬發(fā)送post請求

    發(fā)送post請求的基礎(chǔ)知識dumps和loads 代碼示例: 以微信開放平臺舉例 發(fā)送post請求 查看執(zhí)行結(jié)果: ?上傳文件 查看執(zhí)行結(jié)果 ?封裝post請求 代碼示例: 封裝main方法 代碼示例: 封裝測試類 示例代碼: 光學(xué)理論是沒用的,要學(xué)會跟著一起敲,要動手實操,才能將自己的所學(xué)運用

    2024年02月07日
    瀏覽(22)
  • Python+Requests模擬發(fā)送GET請求

    Python+Requests模擬發(fā)送GET請求

    前置條件: 導(dǎo)入requests庫 一、發(fā)送不帶參數(shù)的get請求 代碼如下: 以百度首頁為例 二、發(fā)送帶參數(shù)的get請求 發(fā)送帶參數(shù)的get請求有幾種方式 方式一:參數(shù)在URL中 代碼如下: 以百度首頁為例 方式二:參數(shù)在字典中 代碼如下: 以百度首頁為例 獲取響應(yīng)數(shù)據(jù)的基本信息 代碼如

    2024年01月20日
    瀏覽(24)
  • python 模塊requests 發(fā)送 HTTP 請求

    一、簡介 requests 模塊是 python 基于 urllib,采用 Apache2 Licensed 開源協(xié)議的 HTTP 庫。它比 urllib 更加方便,可以節(jié)約我們大量的工作 二、安裝 三、方法 requsts.requst(method, url,headers,cookies,proxies,timeout) method:請求方式;字符串類型 url:請求的地址;字符串類型 params:查詢參數(shù),g

    2024年02月11日
    瀏覽(24)
  • Python爬蟲requests判斷請求超時并重新post/get發(fā)送請求

    在上面的示例中,send_request_get函數(shù)接受一個URL作為參數(shù),并可選地指定最大重試次數(shù)和超時時間。函數(shù)使用 requests.get 發(fā)送GET請求,并設(shè)置了超時時間為5秒。如果請求超時,會捕獲 requests.exceptions.Timeout 異常,并輸出重試信息。如果發(fā)生其他異常,會捕獲 requests.exceptions.Req

    2024年02月11日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包