使用requests库通过代理发起请求时出现SSL Handshake错误如何解决
SSL握手超时问题解决方案
- 优先检查代理的SSL协议适配性
Python 3.10搭配OpenSSL 1.1.1默认禁用了TLS 1.0/1.1等旧协议,部分代理服务仅支持旧版TLS协议会导致握手失败。可以在请求中指定SSL上下文强制兼容旧协议,示例代码如下:
import ssl import requests from requests.adapters import HTTPAdapter class SSLAdapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): context = ssl.create_default_context() # 允许TLS 1.0及以上版本,可根据代理实际支持情况调整 context.min_version = ssl.TLSVersion.TLSv1 kwargs["ssl_context"] = context return super().init_poolmanager(*args, **kwargs) url = "https://google.com" session = requests.session() session.mount("https://", SSLAdapter()) proxy = { "http": "http://REDACTED:12345", "https": "https://REDACTED:12345" } r = session.get(url, headers={'User-Agent': get_random_agent()}, proxies=proxy, timeout=30) print(r.status_code)
- 检查代理URL协议配置是否正确
部分HTTPS代理实际只支持HTTP协议接入,你可以尝试将proxy配置中https对应的代理地址前缀改为http:
proxy = { "http": "http://REDACTED:12345", "https": "http://REDACTED:12345" }
- 检查系统/防火墙代理拦截规则
新电脑的系统防火墙、第三方安全软件可能会拦截requests向代理端口发起的SSL连接,你可以临时关闭防火墙测试,如果问题解决,将Python进程和代理端口加入放行规则即可。 - 升级requests及依赖库版本
执行以下命令升级相关依赖,避免已知的兼容性bug:pip install --upgrade requests urllib3 pyopenssl - 增加超时时间配置
部分代理响应速度慢,默认的SSL握手超时阈值太短也会触发报错,可以在get请求中显式设置timeout参数,单位为秒,例如timeout=60。
内容的提问来源于stack exchange,提问作者user3533755
相关产品推荐
相关产品推荐

