Python requests 报错 SSLV3_ALERT_HANDSHAKE_FAILURE 原因与解决方法
0. 问题描述
在使用 Python requests 库对某网站进行 HTTPS 请求时,产生以下错误:
1 | |
1. 问题原因
由于requests库默认使用urllib3作为底层库,而urllib3在2.0及以上版本中使用了OpenSSL 1.1.1,而OpenSSL 1.1.1默认使用TLSv1.3协议,但部分网站不支持TLSv1.3协议,导致握手失败,产生SSLV3_ALERT_HANDSHAKE_FAILURE报错。
TLSv1.3
TLS有很多密码套件,所谓的密码套件(cipher suite)是指一组加密算法、密钥交换算法和消息认证码算法的组合。TLSv1.3中删除了一些不安全的密码套件,只保留了5个密码套件,分别是:
- TLS_AES_128_GCM_SHA256
- TLS_AES_256_GCM_SHA384
- TLS_CHACHA20_POLY1305_SHA256
- TLS_AES_128_CCM_SHA256
- TLS_AES_128_CCM_8_SHA256
这些套件被认定为高度安全的密码套件。
相比于TLSv1.2,TLSv1.3主要删除了以下内容:
- RSA密钥交换:不能提供前向保密性
- CBC模式:容易受到BEAST、Lucky 13攻击
- RC4:HTTPS中的RC4算法已经被证明是不安全的
- 任意Diffie-Hellman群:CVE-2016-0701
- 导出级密码套件:FREAK、Logjam
如果不支持TLSv1.3指定的5种套件,就会导致产生SSLV3_ALERT_HANDSHAKE_FAILURE错误。
2. 解决方法
2.1. 降低urllib3版本
既然是urllib3 2.0引入的TLSv1.3导致的问题,那么降低urllib3版本就可以解决问题。2.0以前的最新版本是1.26.20,命令如下:
1 | |
2.2. 强制使用 TLSv1.2
另一个思路是强制使用之前的套件,即不使用TLSv1.3,而是使用TLSv1.2。
但此方法经过我的测试,不能解决问题。(可能此方法可以解决问题,但未深入研究)
方法在此链接中
3. 参考
Python requests 报错 SSLV3_ALERT_HANDSHAKE_FAILURE 原因与解决方法
https://nacldragon.top/2024/SSLV3-ALERT-HANDSHAKE-FAILURE/