公司网络环境中使用Python requests 库SSL认证失败

news/2024/9/15 22:43:41/文章来源:https://www.cnblogs.com/LogicNorthSea/p/18395686

问题描述

使用python request库访问一个https url会报错,提示自签名错误。但是在浏览器中访问这个url就没问题,在私人电脑上也没问题。

Sample code:

import requests
import certifiprint(certifi.where())
response = requests.get('https://chroma-onnx-models.s3.amazonaws.com/all-MiniLM-L6-v2/onnx.tar.gz', verify=certifi.where())

报错如下:

......
requests.exceptions.SSLError: HTTPSConnectionPool(host='chroma-onnx-models.s3.amazonaws.com', port=443): Max retries exceeded with url: /all-MiniLM-L6-v2/onnx.tar.gz (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1006)')))

原因分析

Python requests 库没有使用系统自带的证书管理器。这意味着他不能像浏览器一样找到一个有效的证书。
所以,解决方案是添加一个可用的根证书到python正在用的PEM文件。这个根证书通常是你的公司签发的,可以在你的浏览器中查看。
这样,一个Python requests 库可用的认证链就建立了。
可以尝试pip install pip_system_certs,或者手动将公司的ROOT CA添加到...\Lib\site-packages\certifi\cacert.pem

拓展阅读

公司的代理服务器如何影响HTTPS流量?
(From copilot)

在公司网络中,代理服务器可能会拦截和检查 HTTPS 流量,这种行为通常被称为“中间人攻击”(Man-in-the-Middle Attack, MITM),但在企业环境中,这种技术被合法地用于监控和保护网络安全。以下是详细解释:

  1. 代理服务器的工作原理
    代理服务器充当客户端(如你的计算机)和目标服务器(如你访问的网站)之间的中介。当你在公司网络中访问 HTTPS 网站时,请求首先发送到代理服务器,然后代理服务器再将请求转发给目标服务器。

  2. SSL/TLS 加密
    HTTPS 使用 SSL/TLS 协议来加密数据传输,确保数据在传输过程中不被窃取或篡改。正常情况下,客户端和目标服务器之间建立一个安全的加密通道。

  3. 代理服务器的拦截和检查
    为了检查 HTTPS 流量,代理服务器会在客户端和目标服务器之间插入自己。具体步骤如下:

代理服务器生成自签名证书:代理服务器会为目标网站生成一个自签名证书,并将其发送给客户端。
客户端信任代理服务器的证书:如果客户端信任代理服务器的证书(通常通过在客户端设备上预装代理服务器的根证书),客户端会接受这个自签名证书,并与代理服务器建立加密连接。
代理服务器与目标服务器建立连接:代理服务器再与目标服务器建立一个独立的加密连接。
4. 证书验证失败的原因
由于代理服务器使用的是自签名证书,而不是目标服务器的真实证书,客户端在验证证书时可能会失败,具体原因包括:

缺少信任:如果客户端没有预装代理服务器的根证书,客户端会认为代理服务器的证书不可信,从而导致 SSL 证书验证失败。
证书链不完整:代理服务器生成的自签名证书可能不包含完整的证书链,导致验证失败。
证书不匹配:客户端期望的证书与代理服务器提供的证书不匹配,导致验证失败。
解决方法
安装代理服务器的根证书:在客户端设备上安装并信任代理服务器的根证书。
配置代理设置:确保在使用 requests 库时正确配置代理设置,并指定正确的证书路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/791910.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不可不知的WPF形状(Shape)

在WPF开发中经常需要进行绘制图形,可以利用Shape类型绘制基本的形状,而且Shape派生自FrameworkElement,属于UI元素范畴,可以直接利用XAML进行绘制。本文通过一些简单的小例子,简述如何通过Shape类绘制形状,仅供学习分享使用,如有不足之处,还请指正。在WPF开发中经常需要…

软件工程第一次个人作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13243这个作业的目标 学会使用Aigc工具生成个人logo,搭建github个人网站,并熟悉markdown编辑,进行自我知识和技能评估学号 1022011…

日本出行

必备飞机 https://www.bilibili.com/video/BV1RC411J7tf/ 前3分钟 南航 全日空航空 出行公交卡(西瓜卡,首充1000 711消费完) 车次 15:42 https://www.bilibili.com/video/BV1j64y1A7x1/ 车次 13:24 https://www.bilibili.com/video/BV1RC411J7tf pasmo卡(只支持地铁,不支持…

智慧环卫:城市清洁的未来图景与技术革新

在智慧城市的宏伟蓝图中,“智慧环卫”正以其独特的姿态,悄然改变着城市的清洁与环境卫生管理方式。智慧环卫不仅仅是技术的简单应用,更是城市管理智慧化、生态化的重要体现。本文旨在深入探讨智慧环卫的内涵、技术支撑、实践案例及对城市环境改善的深远影响。智慧环卫:定义…

AWC 批量查询使用关系的最新版本并导出Excel

1.查询使用关系的方法:* 调用查询返回数据* @param {Object} data* @returns {Promise}* */ export let queryItemRevisionById = function (data) {if (!data.item_id) {messagingService.showInfo("请输入查询条件");return;}var item_id=data.item_id.dbValue.re…

Docker 简介

首先说明一些特性:一个容器中只有一个主进程,遵循单一原则,否则一个容器挂了会导致多个进程挂掉;容器其实就是一个进程,docker可以管理这些进程。docker能够进行容器隔离,我们操作的其实是docker客户端,而不是server端。 docker info # 查看docker信息docker基本概念 doc…

阿里重磅开源Qwen2-VL:超越人类的视觉理解能力,从医学影像到手写识别,这款开源多模态大模型究竟有多强?(附本地化部署教程)

阿里重磅开源Qwen2-VL:超越人类的视觉理解能力,从医学影像到手写识别,这款开源多模态大模型究竟有多强?(附本地化部署教程)模型介绍 最近呢,阿里巴巴开源了Qwen2-VL,在多模态大模型展现了在实际应用中的巨大潜力,尤其是在处理跨模态数据方面表现出众。以下是该模型的几…

2024 秋季PAT认证甲级(题解A1-A4)

2024 秋季PAT认证甲级(题解A-D) 写在前面 这一次PAT甲级应该是最近几次最简单的一次了,3个小时的比赛差不多30分钟就ak了(也是拿下了整场比赛的rk1),下面是题解报告,每个题目差不多都是20-30行代码,难度在洛谷普及组左右(cf 1000-1200分)A. A-1 Happy Patting 题目描述…

安装远程软件

1.进入raylink官网点击立即下载【https://www.raylink.live/download.html】2.下载好后双击安装3.安装完成后打开raylink

Hyper-V 安装 Centos

Author: ACatSmiling Since: 2024-09-02CentOS 安装 ISO 镜像下载官方网站:https://www.centos.org/目前,最新版本为 CentOS Stream 9:本文以 CentOS 7 为例,下载页拉到下面,选择旧版本安装。Older Versions Legacy versions of CentOS are no longer supported. For hist…

使用zig语言制作简单博客网站(八)归档页和关于页

后端代码注册路由// 归档文章router.get("/api/article/archive", &articleController.getArchiveArticles);model/article.zig增加以下代码/// 用于存放归档文章信息 pub const ArchiveArticle = struct {id: u32,title: []const u8,cate_name: []const u8,crea…

多线程、任务、异步的区别

Task和Thread的区别 这是一个高频,深刻的问题,无论去哪都逃不过被询问这个问题。Task是基于Thread的,这是众所周知的。但是Task和Thread的联系如此简单和纯粹确实我没想到的。甚至只需要几十行代码就能呈现其原理。一个简单的模拟实例说明Task及其调度问题,这真是一篇好文章…