追根溯源:
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曲线的示例代码:
-
安装所需的库:
sh$ pip install pyOpenSSL urllib3 requests
-
使用以下代码设置ECDH曲线并发送请求:
pythonimport 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曲线的作用包括:
- 密钥交换: ECDH协议允许双方在不共享私钥的情况下生成一个共享的秘密密钥。这个密钥可以用于后续的对称加密,确保通信的机密性。
- 安全性: 椭圆曲线密码学(ECC)相比传统的基于整数分解或离散对数问题的加密方法(如RSA或DH)提供了更高的安全性。在相同的密钥长度下,ECC提供的安全性更高,因此可以使用较短的密钥实现相同的安全水平,减小了通信开销和处理时间。
- 性能: 由于较短的密钥长度,使用ECC的协议(如ECDH)在计算和传输上都更高效,适合资源受限的环境,如移动设备和物联网设备。
ECDH 曲线的常见类型
不同的ECDH曲线使用不同的椭圆曲线方程和参数。常见的ECDH曲线包括:
- P-256(prime256v1): 这是NIST推荐的一种曲线,基于素数域上的256位椭圆曲线。它是当前最常用的椭圆曲线之一。
- P-384: 这是NIST推荐的另一种曲线,基于素数域上的384位椭圆曲线,提供比P-256更高的安全性。
- P-521: 这是NIST推荐的基于素数域上的521位椭圆曲线,提供最高的安全性。
- X25519: 这是一种现代化的曲线,由Daniel J. Bernstein设计,基于255位的素数域,具有很高的性能和安全性。它已被广泛采用,如在TLS 1.3中。
ECDH密钥交换的过程
- 双方生成密钥对 :
- 每一方生成一个私钥和对应的公钥。私钥是一个随机数,公钥是私钥与椭圆曲线基点的乘积。
- 交换公钥 :
- 双方交换公钥。每一方使用对方的公钥和自己的私钥进行计算。
- 计算共享密钥 :
- 双方使用对方的公钥和自己的私钥进行椭圆曲线点乘运算,计算出共享的秘密密钥。由于椭圆曲线的数学性质,双方计算出的密钥是相同的。
- 使用共享密钥进行对称加密 :
- 共享的秘密密钥可以用来加密和解密后续的通信数据。
ECDH曲线的重要性
- 提高安全性: 使用适当的ECDH曲线可以提供比传统密钥交换协议更高的安全性,特别是在面对量子计算攻击时。
- 优化性能: 选择合适的ECDH曲线可以在保证安全性的前提下,优化加密和解密操作的性能,特别是在资源受限的设备上。
- 互操作性: 标准化的ECDH曲线(如P-256、P-384、X25519等)确保了不同实现之间的互操作性,使得不同系统和设备能够安全通信。
总结来说,ECDH曲线在加密通信中起到了至关重要的作用,通过提供高效且安全的密钥交换机制,确保了数据传输的机密性和完整性。