Python requests 报错 SSLV3_ALERT_HANDSHAKE_FAILURE 原因与解决方法

0. 问题描述

在使用 Python requests 库对某网站进行 HTTPS 请求时,产生以下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
urllib3.exceptions.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1000)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "C:\ProgramData\miniconda3\Lib\site-packages\requests\adapters.py", line 589, in send
resp = conn.urlopen(
^^^^^^^^^^^^^
File "C:\ProgramData\miniconda3\Lib\site-packages\urllib3\connectionpool.py", line 843, in urlopen
retries = retries.increment(
^^^^^^^^^^^^^^^^^^
File "C:\ProgramData\miniconda3\Lib\site-packages\urllib3\util\retry.py", line 519, in increment
raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='example.com', port=443): Max retries exceeded with url: /my-url/ (Caused by SSLError(SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1000)')))

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.2TLSv1.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
pip uninstall urllib3
pip install urllib3==1.26.20

2.2. 强制使用 TLSv1.2

另一个思路是强制使用之前的套件,即不使用TLSv1.3,而是使用TLSv1.2

但此方法经过我的测试,不能解决问题。(可能此方法可以解决问题,但未深入研究)

方法在此链接中

3. 参考


Python requests 报错 SSLV3_ALERT_HANDSHAKE_FAILURE 原因与解决方法
https://nacldragon.top/2024/SSLV3-ALERT-HANDSHAKE-FAILURE/
作者
NaCl
发布于
2024年9月29日
许可协议