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

追根溯源:

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

sh 复制代码
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. 安装所需的库:

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

    python 复制代码
    import ssl
    import urllib3
    import requests
    from urllib3 import PoolManager
    from urllib3.util.ssl_ import create_urllib3_context
    
    class 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.context
            return super().init_poolmanager(*args, **kwargs)
    
        def proxy_manager_for(self, *args, **kwargs):
            kwargs['ssl_context'] = self.context
            return 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验证失败,可继续尝试其他曲线prime256v1、secp384r1

其他

另可通过配置忽略告警

python 复制代码
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曲线在加密通信中起到了至关重要的作用,通过提供高效且安全的密钥交换机制,确保了数据传输的机密性和完整性。

相关推荐
在世修行4 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
2601_962885724 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI4 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
yyuuuzz4 小时前
跨境站点日志时区混乱的排查记录
运维·服务器·网络·云计算·aws·1024程序员节
GlobalInfo5 小时前
全球及中国风电叶片检测机器人行业研究报告(2026版):市场现状、行业前景与占有率分析
运维·网络·人工智能·机器人
信誓旦旦的程序猿5 小时前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫5 小时前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障
运维行者_7 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php
2401_868534787 小时前
陈冲2026年上海纽约大学全英文毕业演讲
服务器·网络
KeepRobots7 小时前
11-01 温哥华不回拨:用 60 行 Python 查你的工单系统会不会差一小时(KeepRobots 工程笔记)
python