urllib3 發起https請求時報錯 certificate verify failed

情況描述

近期需要訪問https的一個API接口同步數據,在辦公主機完成urllib3初步的測試以后,到測試環境驗證發現無法請求,報錯:

提示:解決辦法可以直接到第四節查看

一、提示 SSL 認證失敗
OpenSSL.SSL.Error: [('SSL routines', '', 'certificate verify failed')]二、提示失敗超過重試次數
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool

分析

一、考慮環境問題 (未解決)

1)發現測試環境可以正常運行,但是在pycharm上面的python 控制臺運行就失敗

腳本節選:

import urllib3
data_api = 'https://xxx.xxx.com/api'
# 請求接口
http = urllib3.PoolManager()
api_response = http.request('GET', data_api)

分析:

考慮是測試環境使用OS的證書,與django應用使用的不同(后面驗證發現不是這個問題)

處理:

1、依據網上提供的解決辦法,跳過SSL認證,沒效果

api_response = http.request('GET', data_api, verify=False)

2、嘗試使用OS證書,貌似也沒效果

測試服務器執行:

獲取請求信息:
curl -vk https://xxx.xxx.com/api
* Connected to xxx.xxx.com (xxx.xxx.xxx.xxx) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* skipping SSL peer certificate verification
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
獲取版本信息:
openssl version'OpenSSL 1.0.2k-fips  26 Jan 2017'
獲取支持的密碼套件:
openssl ciphers

二、嘗試抓包 (未解決)

# 執行如下命令,然后在pycharm執行腳本 Ctrl+c結束抓取
tcpdump  -n port 443 -w xxxxx_test_failed.pcap
# 執行如下命令,然后在命令行執行腳本 Ctrl+c結束抓取
tcpdump  -n port 443 -w xxxx_test_success.pcap

分析:

1、異常的包,在Server Hello 發出后,有如下的報文,然后就重復嘗試連接

TLSv1.2?? ?73?? ?Alert (Level: Fatal, Description: Unknown CA)

2、Server Hello 的報文 指定了密碼套件

Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)

3、發現客戶端發起的Client Hello 報文中,異常的請求包 Cipher Suites中沒有服務端指定的密碼套件,正常的包里面是存在的

4、同一臺服務器的同一個解釋器,發起請求有Cipher Suites差異,這個原因不明

5、urllib3.util 下有一個 _ssl.py 里面有Cipher Suites的配置信息

處理思路:

1、由于異常請求密碼套件缺失,正常的是有的,所以客戶端是可以加載這個套件的

2、然后去找加載指定密碼套件的方式,urllib沒有暴露明顯的設置套件的函數或者方法

3、網上也沒有找到合適的方式,以下有個類似的,但是沒有解決問題,而且他提供的Cipher Suites?現在的版本已經提供了,而且并不是我需要的Cipher Suites

Requests中SSl指紋識別問題解決_go request 修改tls 指紋-CSDN博客

?替代方案

未找到合適的解決辦法,嘗試其他的發起請求的方式

1、使用requests,有相似的報錯 (未解決)

import requests
requests.get('https://xxx.xxx.com/api') 

2、使用urllib 可以正常請求 切換請求方式 (替代方案

import urllib.request
urllib.request.urlopen('https://xxx.xxx.com/api')

解決方案

找同事求教 提供如下解決辦法 缺少ssl_context ,如下方案:

import urllib3
import ssl
data_api = 'https://xxx.xxx.com/api'
ctx = ssl.create_default_context()
http = urllib3.PoolManager(ssl_context=ctx)
api_response = http.request('GET', data_api,timeout=10,retries=5)

分析:

可能是pycharm上面的運行環境缺失部分的環境變量,需要通過一些方式去找到證書以及一些參數,默認使用的 urllib3.util.ssl_.create_urllib3_context() 構建的 ssl_context?無法使用load_default_certs() load OS default certs;

反思

一、這次問題難度確實比較大,能找到解決辦法實屬偶然,但是沒有完成任務前死磕這個問題,實屬不太明智,應盡早切換方式,完成任務后再深入研究問題原因;

二、這次問題,通過抓包發現了異常所在,但是看到的表現Cipher Suites缺失去找解決問題的思路錯了,問題還是在于pycharm環境下無法獲取到這部分參數,貌似也不能解釋urllib能正常請求的情況;

三、網絡問題看不出來,還是得抓包,wireshark 得練練了;

四、相關博客

爬蟲實戰學習筆記_4 網絡請求urllib3模塊:發送GET/POST請求實例+上傳文件+IP代理+json+二進制+超時_urllib3 post-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14426.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14426.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14426.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

保安維穩,四信以科技構筑高速公路安全智慧防線

近日,廣東梅大高速發生嚴重塌方事故,造成了嚴重的人員傷亡和財產損失。這一事件在公眾心中敲響了安全的警鐘,再次引起了公眾對于交通設施運營安全性的重點關注。 國務院安委會辦公室和國家防災減災救災委員會辦公室等主管機構先后印發緊急通知…

Spring Security整合Gitee第三方登錄

文章目錄 學習鏈接環境準備1. 搭建基本web應用引入依賴ThirdApp啟動類創建index頁面application.yml配置訪問測試 2. 引入security引入依賴ProjectConfig訪問測試 第三方認證簡介注冊gitee客戶端實現1引入依賴application.yml配置文件創建index.html頁面啟動類InfoControllerPr…

【數學建模】儲藥柜的設計

2014高教社杯全國大學生數學建模競賽D題目 題目描述 儲藥柜的結構類似于書櫥,通常由若干個橫向隔板和豎向隔板將儲藥柜分割成若干個儲藥槽(如圖1所示)。為保證藥品分揀的準確率,防止發藥錯誤,一個儲藥槽內只能擺放同一種藥品。藥品在儲藥槽…

Python閉包探索,釋放函數記憶的秘術

引言 hello,大家好,我是一點,專注于Python編程,如果你也對感Python感興趣,歡迎關注交流。 希望可以持續更新一些有意思的文章,如果覺得還不錯,歡迎點贊關注,有啥想說的,可…

docker搭建gitlab及默認密碼修改及配置修改

推薦官方文檔 https://docs.gitlab.com/17.0/ee/install/docker.html 我使用的是docker run的方式,官方文檔后面有docker-compose、swarm、k8s的部署文檔 版本說明 1:可以部署gitlab-ce社區版和gitlab-ee企業版,然后,鑒于是個人…

Mysql總結2

Mysql慢優化 在mysql中,long_query_time的值為10,當sql語句執行的時間超過這個數值時,則會被記錄到慢查詢日志中。 Mysql語句查詢流程 1、客戶端發送sql語句到服務端; 2、服務端查看是否打開了緩存,若緩存打開&…

AIGC繪畫設計基礎-建筑設計應用

一、AI及AIGC 對于AI大家都不陌生,但是AIGC這個概念好多人其實不大清楚。“AI”是指人工智能技術本身,而“AIGC”是指基于人工智能技術而生成的內容。 生成式人工智能——AIGC(Artificial Intelligence Generated Content)&…

近鄰算法詳解

近鄰算法(Nearest Neighbor Algorithm),也稱為K-近鄰算法(K-Nearest Neighbors,KNN),是一種基本的分類和回歸方法。它的工作原理非常直觀:通過測量不同特征點之間的距離來進行預測。…

使用CommandLine庫創建.NET命令行應用

CommandLine是一個.NET庫,用于創建命令行應用程序。它提供了一種簡單的方法來解析命令行參數,并且可以幫助您構建一個功能強大的命令行界面。在本文中,我們將介紹如何使用CommandLine庫創建.NET命令行應用程序。 1. 背景 在.NET開發中&#…

SpringFramework實戰指南

二、SpringFramework實戰指南 目錄 一、技術體系結構 1.1 總體技術體系1.2 框架概念和理解 二、SpringFramework介紹 2.1 Spring 和 SpringFramework概念2.2 SpringFramework主要功能模塊2.3 SpringFramework 主要優勢 三、Spring IoC容器和核心概念 3.1 組件和組件管理概念3…

起底震網病毒的來龍去脈

2010年,震網病毒被發現,引起世界嘩然,在后續的10年間,陸陸續續有更多關于該病毒的背景和細節曝光。今年,《以色列時報》和《荷蘭日報》又披露了關于此事件的更多信息,基于這些信息,我們重新梳理…

優于InstantID!中山大學提出ConsistentID:可以僅使用單個圖像根據文本提示生成不同的個性化ID圖像

給定一些輸入ID的圖像,ConsistentID可以僅使用單個圖像根據文本提示生成不同的個性化ID圖像。效果看起來也是非常不錯。 相關鏈接 Code:https://github.com/JackAILab/ConsistentID Paper:https://ssugarwh.github.io/consistentid.github.io/arXiv.pd…

計算機畢業設計 | springboot養老院管理系統 老人社區管理(附源碼)

1,緒論 1.1 背景調研 養老院是集醫療、護理、康復、膳食、社工等服務服務于一體的綜合行養老院,經過我們前期的調查,院方大部分工作采用手工操作方式,會帶來工作效率過低,運營成本過大的問題。 院方可用合理的較少投入取得更好…

Python數據可視化(七)

繪制 3D 圖形 到目前為止,我們一直在討論有關 2D 圖形的繪制方法和繪制技術。3D 圖形也是數據可視化的 一個很重要的應用方面,我們接下來就重點講解有關 3D 圖形的實現方法。繪制 3D 圖形通常需要導 入 mpl_toolkits 包中的 mplot3d 包的相關模塊&#x…

三、Gazebo中實現機器人仿真(小白上手)+ubuntu18.04

接上一篇文章 1、\導航 vim .bashrc \先采用Nanocar嘗試導航 關閉終端:roslaunch robot_navigation gmapping.launch simulation:true rosrun teleop_twist_keyboard teleop_twist_keyboard.py 重啟終端: cd catkin_ws source ./devel/setu…

護網經驗面試題目原版

文章目錄 一、護網項目經驗1.項目經驗**Hvv的分組和流程**有沒有遇到過有意思的邏輯漏洞?有沒有自己開發過武器/工具?有做過代碼審計嗎?有0day嗎有cve/cnvd嗎?有src排名嗎?有沒有寫過技戰法有釣魚經歷嗎?具…

【數據結構】哈夫曼樹和哈夫曼編碼

一、哈夫曼樹 1.1 哈夫曼樹的概念 給定一個序列,將序列中的所有元素作為葉子節點構建一棵二叉樹,并使這棵樹的帶權路徑長度最小,那么我們就得到了一棵哈夫曼樹(又稱最優二叉樹) 接下來是名詞解釋: 權&a…

VC++位移操作>>和<<以及邏輯驅動器插拔產生的掩碼dbv.dbcv_unitmask進行分析的相關代碼

VC位移操作>>和<<以及邏輯驅動器插拔產生的掩碼dbv.dbcv_unitmask進行分析的相關代碼 一、VC位移操作符<<和>>1、右位移操作符 >>&#xff1a;2、左位移操作符 <<&#xff1a; 二、邏輯驅動器插拔產生的掩碼 dbv.dbcv_unitmask 進行分析的…

如何使用Suno:免費的AI歌曲生成器

文章目錄 Suno AI 是什么&#xff1f;Suno AI 如何工作&#xff1f;選擇Suno AI的理由&#xff1a;核心優勢易于操作多樣化創作靈活的定價策略版權保障技術突破 如何使用Suno AI創作歌曲&#xff1f;第1步&#xff1a;注冊Suno AI賬戶第2步&#xff1a;輸入提示詞創建第 3 步&a…