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验证失败,可继续尝试其他曲线prime256v1secp384r1

其他

另可通过配置忽略告警

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

相关推荐
achaoyang8 分钟前
【Python中while循环】
开发语言·python
hgdlip13 分钟前
Win7电脑IP地址查看与变换指南
网络协议·tcp/ip·电脑·win7
eclipsercp42 分钟前
PyQt5:Python GUI开发的超级英雄
开发语言·python·qt
Lostgreen1 小时前
计算机网络----基本概念
网络·笔记·学习·计算机网络
sxy1993sxy20181 小时前
HTTP请求失败调试过程 -20241126
网络·网络协议·http
codists1 小时前
《Django 5 By Example》阅读笔记:p339-p358
python·django
檀越剑指大厂1 小时前
【Python系列】异步 Web 服务器
服务器·前端·python
孤邑1 小时前
【Linux】网络通信
linux·服务器·网络·笔记·学习
m0_676099581 小时前
数据结构--创建链表--Python
数据结构·python·链表
网络研究院1 小时前
防御网络攻击的创新策略
网络·安全·攻击·风险·威胁·策略