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.mzph.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…