Python 3.10中requests.post遇SSLV3握手失败报错,3.9正常求解决
SSLV3_ALERT_HANDSHAKE_FAILURE 问题解决(Python 3.10 vs 3.9)
问题背景
使用Python 3.10 + requests 2.31.0 + pyOpenSSL 23.2.0发送POST请求:
res = requests.post( url, data=json.dumps(data), headers=self.headers, verify=False )
触发报错:
SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:997)')
已知信息:
- 该请求在Python 3.9环境下可正常执行
- 本地OpenSSL版本为
OpenSSL 1.1.1n 15 Mar 2022 - 服务器通过
openssl s_client -connect 10.10.96.28:443验证,支持TLSv1.2,加密套件为AES256-GCM-SHA384
解决方法
1. 自定义SSL上下文适配服务器配置
Python 3.10默认的TLS加密套件或版本范围与3.9存在差异,可手动指定TLSv1.2和服务器支持的加密套件:
import requests import ssl from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager class TLS12Adapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): # 创建SSL上下文 ctx = ssl.create_default_context() # 指定服务器支持的加密套件 ctx.set_ciphers('AES256-GCM-SHA384') # 强制启用TLSv1.2 ctx.options &= ~ssl.OP_NO_TLSv1_2 kwargs['ssl_context'] = ctx return super().init_poolmanager(*args, **kwargs) # 初始化session并挂载适配器 session = requests.Session() session.mount('https://', TLS12Adapter()) # 发送请求 res = session.post(url, data=json.dumps(data), headers=self.headers, verify=False)
2. 对齐Python 3.9环境依赖版本
如果自定义上下文过于繁琐,可直接将requests、pyOpenSSL版本降级到Python 3.9环境中可正常运行的版本,消除版本差异带来的配置问题。
3. 禁用ALPN协商
从服务器的openssl s_client结果来看,未协商ALPN协议,而Python 3.10可能默认启用ALPN检查,可在SSL上下文中禁用:
ctx = ssl.create_default_context() ctx.set_alpn_protocols([]) # 结合其他配置(如指定TLS版本、加密套件)使用
内容的提问来源于stack exchange,提问作者NicoCaldo
相关产品推荐
相关产品推荐

