Caused by SSLError(SSLError(1, ‘[SSL: BAD_ECPOINT] bad ecpoint (_ssl.c:852)‘)

追根溯源:

python在访问https请求时,在没有证书的情况下需要设置忽略证书,但有时候证书的忽略会引发其他异常,如:

requests.exceptions.SSLError: HTTPSConnectionPool(host='127.0.0.1', port=443): Max retries exceeded with url: /api/logins (Caused by SSLError(SSLError(1, '[SSL: BAD_ECPOINT] bad ecpoint (_ssl.c:852)'),))

此时虽然证书验证已经忽略了,但是密钥交换协议(ECDH曲线)成了一个难题,若没有服务端没有提供对应的密钥交换协议,我们只能一个个去尝试处理。

设置ECDH曲线

requests库中设置ECDH曲线(例如X25519)可以通过定制SSL上下文来实现。你可以使用urllib3库来创建自定义的SSL上下文,并将其应用于requests会话中。以下是如何设置ECDH曲线的示例代码:

  1. 安装所需的库:

    $ pip install pyOpenSSL urllib3 requests
    
  2. 使用以下代码设置ECDH曲线并发送请求:

    import ssl
    import urllib3
    import requests
    from urllib3 import PoolManager
    from urllib3.util.ssl_ import create_urllib3_contextclass SSLAdapter(requests.adapters.HTTPAdapter):def __init__(self, *args, **kwargs):self.context = create_urllib3_context()try:self.context.set_ecdh_curve('X25519')  # 试试X25519曲线except ssl.SSLError:print("X25519 not supported, falling back to default curve")super().__init__(*args, **kwargs)def init_poolmanager(self, *args, **kwargs):kwargs['ssl_context'] = self.contextreturn super().init_poolmanager(*args, **kwargs)def proxy_manager_for(self, *args, **kwargs):kwargs['ssl_context'] = self.contextreturn super().proxy_manager_for(*args, **kwargs)session = requests.Session()
    session.mount('https://', SSLAdapter())url = 'https://127.0.0.1/api/logins'
    response = session.get(url)
    print(response.content)
    
解释
  • SSLAdapter:自定义HTTPAdapter,用于设置SSL上下文。
  • create_urllib3_context():创建一个基本的SSL上下文。
  • self.context.set_ecdh_curve(‘X25519’):设置ECDH曲线为X25519
注意事项
  • 确保你使用的OpenSSL版本支持X25519曲线。

  • 这种方法适用于定制SSL设置,尤其是在安全性需求较高的场景中。

  • X25519验证失败,可继续尝试其他曲线prime256v1secp384r1

其他

另可通过配置忽略告警

urllib3.disable_warnings()

什么是ECDH曲线?

ECDH(Elliptic Curve Diffie-Hellman)是一种基于椭圆曲线的密钥交换协议,用于在不安全的信道上安全地交换加密密钥。ECDH曲线是ECDH协议的一部分,用于定义椭圆曲线上的数学运算。具体来说,ECDH曲线的作用包括:

  1. 密钥交换: ECDH协议允许双方在不共享私钥的情况下生成一个共享的秘密密钥。这个密钥可以用于后续的对称加密,确保通信的机密性。
  2. 安全性: 椭圆曲线密码学(ECC)相比传统的基于整数分解或离散对数问题的加密方法(如RSA或DH)提供了更高的安全性。在相同的密钥长度下,ECC提供的安全性更高,因此可以使用较短的密钥实现相同的安全水平,减小了通信开销和处理时间。
  3. 性能: 由于较短的密钥长度,使用ECC的协议(如ECDH)在计算和传输上都更高效,适合资源受限的环境,如移动设备和物联网设备。
ECDH 曲线的常见类型

不同的ECDH曲线使用不同的椭圆曲线方程和参数。常见的ECDH曲线包括:

  1. P-256(prime256v1): 这是NIST推荐的一种曲线,基于素数域上的256位椭圆曲线。它是当前最常用的椭圆曲线之一。
  2. P-384: 这是NIST推荐的另一种曲线,基于素数域上的384位椭圆曲线,提供比P-256更高的安全性。
  3. P-521: 这是NIST推荐的基于素数域上的521位椭圆曲线,提供最高的安全性。
  4. X25519: 这是一种现代化的曲线,由Daniel J. Bernstein设计,基于255位的素数域,具有很高的性能和安全性。它已被广泛采用,如在TLS 1.3中。
ECDH密钥交换的过程
  1. 双方生成密钥对
    • 每一方生成一个私钥和对应的公钥。私钥是一个随机数,公钥是私钥与椭圆曲线基点的乘积。
  2. 交换公钥
    • 双方交换公钥。每一方使用对方的公钥和自己的私钥进行计算。
  3. 计算共享密钥
    • 双方使用对方的公钥和自己的私钥进行椭圆曲线点乘运算,计算出共享的秘密密钥。由于椭圆曲线的数学性质,双方计算出的密钥是相同的。
  4. 使用共享密钥进行对称加密
    • 共享的秘密密钥可以用来加密和解密后续的通信数据。
ECDH曲线的重要性
  1. 提高安全性: 使用适当的ECDH曲线可以提供比传统密钥交换协议更高的安全性,特别是在面对量子计算攻击时。
  2. 优化性能: 选择合适的ECDH曲线可以在保证安全性的前提下,优化加密和解密操作的性能,特别是在资源受限的设备上。
  3. 互操作性: 标准化的ECDH曲线(如P-256、P-384、X25519等)确保了不同实现之间的互操作性,使得不同系统和设备能够安全通信。

总结来说,ECDH曲线在加密通信中起到了至关重要的作用,通过提供高效且安全的密钥交换机制,确保了数据传输的机密性和完整性。

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

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

相关文章

【开发环境】MacBook M2安装git并拉取gitlab项目,解决gitlab出现Access Token使用无效的方法

文章目录 安装Homebrew安装git打开IDEA配置git打开IDEA拉取项目 安装Homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"在iTerm等命令行工具打开后,输入上面的命令 之后根据中文提示完成Homebrew的下载…

使用StringStream处理字符串

使用StringStream处理字符串 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨在Java中如何使用StringStream处理字符串,以及它的应…

高考填报志愿,是选就业前景?还是选自己的兴趣爱好?

一、 当前的就业形式 受yi情影响,全国的就业处于下滑趋势,互联网和实体企业呈现疲软势态,很多企业不得不裁员。大学毕业生人数几乎每年都会上涨,带来的是僧多粥少的就业状态。 考得好不如报得好 就业环境如此严峻的形势下&#…

itext生成pdf文件demo示例

需求 在PDF文件中植入一些信息(pdf模版) 制作模版 可以看到下面红色箭头标注位置,这都是我们需要动态写入数据的表单域,可以使用wps等工具来制作 点击编辑表单,可以给对应空间添加表单域,表单域名称是ke…

网络专线学习

准备工作: https://help.aliyun.com/zh/express-connect/user-guide/before-you-start?spma2c4g.11186623.0.0.593f6746C17guR 专线接入流程 https://help.aliyun.com/zh/express-connect/user-guide/process-of-creating-a-dedicated-physical-connection?spma2c…

Redis 哨兵主备切换的数据丢失问题应该怎么解决?

引言:Redis作为一种高性能的内存数据库,广泛应用于分布式系统中。为了保证服务的高可用性,Redis提供了哨兵(Sentinel)机制,用于监控和管理Redis实例的自动故障恢复。然而,即使在哨兵的保护下&am…

Golang | Leetcode Golang题解之第204题计数质数

题目&#xff1a; 题解&#xff1a; func countPrimes(n int) int {primes : []int{}isPrime : make([]bool, n)for i : range isPrime {isPrime[i] true}for i : 2; i < n; i {if isPrime[i] {primes append(primes, i)}for _, p : range primes {if i*p > n {break}…

idea 项目互联网转内网开发 依赖报错问题 maven问题

场景&#xff1a; 这个问题困扰好久&#xff0c;通过分析后&#xff0c;发现是maven配置问题&#xff0c;废话不多说&#xff0c;上干活。 问题描述 项目互联网从转内网开发&#xff0c;提前下载好repository&#xff0c;跟项目一起导入内网&#xff0c;导入后&#xff0c;发…

行内块元素的幽灵空白问题:揭秘与解决策略

在CSS布局中&#xff0c;行内块元素&#xff08;inline-block&#xff09;的使用可以提供更多的控制和灵活性&#xff0c;但它们也可能带来一些棘手的问题&#xff0c;尤其是所谓的“幽灵空白”问题。本文将探讨这一问题的原因&#xff0c;以及如何通过几种不同的方法来解决它。…

ubuntu 18 虚拟机安装(6) postgresql pg_dump pg_restore

ubuntu 18 虚拟机安装&#xff08;6&#xff09; postgres pg_dump pg_restore postgresql 10.3 下的 pg_dump、pg_restore https://blog.csdn.net/ctypyb2002/article/details/79881745 pg_dump pg_dump dumps a database as a text file or to other formats.Usage:pg_dum…

django带了一个权限系统

Django 自带了一个强大的权限系统&#xff0c;它允许开发者精细地控制应用程序中的访问权限。这个系统主要包括用户(User)、用户组(Group)、权限(Permission)以及对象权限(Object-level Permissions)几个核心组件。以下是该权限系统的详细解析&#xff1a; 1. 用户(User) 模型…

IPython高级技巧:使用%edit命令编辑变量和函数

IPython是一个强大的交互式Python解释器&#xff0c;它提供了许多有用的命令和功能来增强Python编程体验。%edit命令是IPython中一个非常实用的功能&#xff0c;它允许用户在IPython环境中直接编辑变量或函数&#xff0c;并立即应用更改。本文将详细介绍如何在IPython中使用%ed…

嵌入式计算器模块实现

嵌入式计算器模块规划 计算器混合算法解析 上面我们的算法理论已经完善, 我们只用给一个混合运算式, 计算器就可以帮助我们计算出结果. 但是存在一个痛点, 每次计算算式,都要重新编译程序, 所以我们想到了, 利用单片机, 读取用户输入的按键, 组成算式, 输入给机器, 这样我们就…

phpSpider实用案例分享:如何爬取电商网站的商品信息?

phpspider实用案例分享&#xff1a;如何爬取电商网站的商品信息&#xff1f; 随着电商行业的蓬勃发展&#xff0c;越来越多的企业和个人开始在互联网上开设自己的电商网站。这些网站上展示的商品信息是用户进行购物和交易的主要依据。对于一些市场研究人员、竞争对手或者开发者…

Scrapy中爬虫优化技巧分享

scrapy是一个非常有用的python爬虫框架&#xff0c;它可以帮助我们轻松地从不同的网站上获取数据。同时&#xff0c;scrapy也有越来越多的用户在使用它来爬取数据&#xff0c;因此&#xff0c;在使用scrapy的过程中&#xff0c;我们需要考虑如何优化我们的爬虫&#xff0c;以便…

读AI新生:破解人机共存密码笔记15辅助博弈

1. 辅助博弈 1.1. assistance game 1.2. 逆强化学习如今已经是构建有效的人工智能系统的重要工具&#xff0c;但它做了一些简化的假设 1.2.1. 机器人一旦通过观察人类学会了奖励函数&#xff0c;它就会采用奖励函数&#xff0c;这样它就可以执行相同的任务 1.2.1.1. 解决这…

Dominate_一个用于生成和操作 HTML 文档的 Python 库

目录 01初识 Dominate 什么是 Dominate&#xff1f; 为什么选择 Dominate&#xff1f; 安装与配置 02Dominate 的基本使用 创建简单的 HTML 文档 添加表格 嵌套结构 03Dominate 的高级功能 动态内容生成 使用…

算法训练 | 动态规划Part11 | 1143.最长公共子序列、392.判断子序列

目录 1143.最长公共子序列 动态规划法 392.判断子序列 动态规划法 1143.最长公共子序列 题目链接&#xff1a;1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 动态规划法 解题思路 本题和动态规划&#xff1a;718. 最长…

Edu Codeforces Round167 (Div2)--(A~D)题解

Problem - A - Codeforces 思路&#xff1a;当且仅当y<-2是追不上的。 void solve(){ Aint x,y; cin>>x>>y;if(y<-2) cout<<"NO"<<endl;else cout<<"YES"<<endl; } Problem - B - Codefor…

C++编程逻辑讲解step by step:重载运算符+和-,实现按订单出入库操作。

题目 每按订单发一次货品A&#xff0c;库存都会相应地减少&#xff0c;每次退货&#xff0c;库存都会增加。分别定义货品A库存和订单为两个类&#xff1a;Inventory和Order&#xff0c;库存类Inventory中有货品名称、货品余量属性&#xff1b;订单类Order中有货品名称、数量、…