Python requests抓取clasificadosonline.com遇SSL握手失败错误原因排查
SSL握手失败错误原因分析
错误原因拆解
从报错SSLV3_ALERT_HANDSHAKE_FAILURE来看,核心是你的请求和目标服务器的SSL/TLS握手流程无法完成,常见原因有以下几点:
- 协议版本不兼容:目标服务器可能禁用了SSLv3、TLS 1.0这类旧版协议,仅支持TLS 1.2或更高版本,但
requests默认的协议范围包含这些旧版本,被服务器直接拒绝。 - 加密套件不匹配:服务器要求的加密套件和
requests默认使用的加密套件没有交集,握手时无法协商出双方都认可的加密方式,导致失败。 - 证书验证问题:虽然报错指向握手,但也可能是服务器证书未被本地信任(比如自签名证书、过期证书),不过这种情况通常会有更明确的证书错误提示,优先级低于前两点。
解决办法
针对上述原因,可以通过以下方式调整请求配置:
1. 指定支持的TLS版本
强制请求使用服务器兼容的TLS版本,比如TLS 1.2或1.3,示例代码如下:
import requests import ssl from requests.adapters import HTTPAdapter from urllib3.util.ssl_ import create_urllib3_context class TLS12Adapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): # 强制使用TLS 1.2 ctx = create_urllib3_context(ssl_version=ssl.PROTOCOL_TLSv1_2) kwargs['ssl_context'] = ctx return super().init_poolmanager(*args, **kwargs) url = 'https://clasificadosonline.com/' try: session = requests.Session() # 将适配器挂载到HTTPS请求 session.mount('https://', TLS12Adapter()) response = session.get(url) response.raise_for_status() print(response.text) except requests.exceptions.RequestException as e: print(f"请求失败: {e}")
2. 匹配服务器要求的加密套件
如果是加密套件不匹配,可以先查询目标服务器支持的加密套件,再在代码中指定:
# 在上文的TLSAdapter类中修改加密套件配置 ctx.set_ciphers('ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256')
3. 临时关闭证书验证(不推荐用于生产环境)
如果是证书信任问题,可临时关闭验证测试,但这会带来安全风险:
response = requests.get(url, verify=False)
内容的提问来源于stack exchange,提问作者Josue Laborde
相关产品推荐
相关产品推荐

