Requests库SSL握手失败问题分析与解决方案
2025-04-30 20:35:16作者:秋泉律Samson
问题背景
在使用Python的Requests库(2.31.0版本)访问HTTPS网站时,部分用户遇到了"SSLV3_ALERT_HANDSHAKE_FAILURE"错误。这个问题在Requests 2.29.0版本中不会出现,但在2.31.0版本中却频繁发生。本文将深入分析这一问题的技术原因,并提供有效的解决方案。
错误现象
当用户尝试使用Requests库访问某些HTTPS网站时,会遇到如下错误提示:
requests.exceptions.SSLError: HTTPSConnectionPool(host='www.example.com', port=443): Max retries exceeded with url: /path (Caused by SSLError(SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1006)')))
技术分析
版本差异
经过技术分析,这个问题并非直接由Requests 2.31.0版本本身引起。Requests库底层依赖urllib3来处理HTTP/HTTPS连接。关键的变化在于:
- Requests 2.29.0及更早版本使用urllib3 1.x系列
- Requests 2.31.0版本开始使用urllib3 2.0系列
根本原因
urllib3 2.0版本在SSL/TLS处理方面做出了重大改进:
- 不再使用固定的密码套件列表
- 完全依赖系统OpenSSL的配置
- 移除了对老旧、不安全协议的支持
这种改变提高了安全性,但也可能导致与某些配置特殊的服务器握手失败,特别是那些:
- 使用非标准或较老的加密套件
- 配置了特殊的SSL/TLS参数
- 使用自签名或非标准证书
解决方案
方法一:自定义SSL上下文
最可靠的解决方案是创建自定义SSL上下文并传递给Requests:
import requests
import ssl
from urllib3.util import ssl_
# 创建自定义SSL上下文
ctx = ssl_.create_urllib3_context()
ctx.load_default_certs()
# 使用自定义上下文
session = requests.Session()
session.mount('https://', requests.adapters.HTTPAdapter(max_retries=3, ssl_context=ctx))
response = session.get('https://example.com')
方法二:调整密码套件
如果知道目标服务器支持的加密套件,可以明确指定:
import requests
import ssl
from urllib3.util import ssl_
ctx = ssl_.create_urllib3_context()
ctx.set_ciphers('ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20')
session = requests.Session()
session.mount('https://', requests.adapters.HTTPAdapter(max_retries=3, ssl_context=ctx))
方法三:临时降级方案
作为临时解决方案,可以降级到Requests 2.30.0版本:
pip install requests==2.30.0
但这不是长期推荐的做法,因为新版本提供了更好的安全性。
最佳实践建议
- 优先使用自定义SSL上下文:这是最灵活且安全的解决方案
- 保持库更新:不要因为兼容性问题而长期使用旧版本
- 测试不同环境:在开发、测试和生产环境中验证SSL连接
- 监控SSL/TLS配置:定期检查服务器SSL配置是否符合最新安全标准
总结
Requests库与urllib3的版本升级带来了更安全的默认配置,但也可能导致与特定服务器的SSL握手问题。通过理解底层机制并采用自定义SSL上下文的解决方案,开发者可以在保证安全性的同时解决兼容性问题。建议开发者根据实际环境选择最适合的解决方案,并持续关注安全更新。
登录后查看全文
热门项目推荐
相关项目推荐
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
yuanrongopenYuanrong runtime:openYuanrong 多语言运行时提供函数分布式编程,支持 Python、Java、C++ 语言,实现类单机编程高性能分布式运行。Go051
pc-uishopTNT开源商城系统使用java语言开发,基于SpringBoot架构体系构建的一套b2b2c商城,商城是满足集平台自营和多商户入驻于一体的多商户运营服务系统。包含PC 端、手机端(H5\APP\小程序),系统架构以及实现案例中应满足和未来可能出现的业务系统进行对接。Vue00
ebook-to-mindmapepub、pdf 拆书 AI 总结TSX01
项目优选
收起
deepin linux kernel
C
27
11
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
541
3.77 K
Ascend Extension for PyTorch
Python
351
419
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
889
615
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
338
186
openJiuwen agent-studio提供零码、低码可视化开发和工作流编排,模型、知识库、插件等各资源管理能力
TSX
988
253
openGauss kernel ~ openGauss is an open source relational database management system
C++
169
233
暂无简介
Dart
778
194
华为昇腾面向大规模分布式训练的多模态大模型套件,支撑多模态生成、多模态理解。
Python
115
141
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.35 K
759