快速回答
代理中的SSL: CERTIFICATE_VERIFY_FAILED是什么意思?
CERTIFICATE_VERIFY_FAILED 意味着您的客户端无法验证网站的 TLS 证书。通过像 CrawlRelay 网关这样的 CONNECT 代理,TLS 是端到端的,因此代理不会引起该问题。请检查您这边:过期的 CA 包、杀毒软件或检查 HTTPS 的公司防火墙,或者系统时钟错误。切勿在生产环境中用 verify=False 来修复。
SSL: CERTIFICATE_VERIFY_FAILED一览
| 错误 | SSL: CERTIFICATE_VERIFY_FAILED |
|---|---|
| 类型 | 客户端的 TLS 证书错误 |
| 发送方 | 当您的 TLS 库无法验证网站的证书时 |
| 定义于 | X.509 path validation: RFC 5280; TLS 1.3: RFC 8446 |
| 要重试吗? | 否。修复信任存储或网络 |
| 先检查 | 在同一台机器上无需代理测试相同的 URL |
SSL: CERTIFICATE_VERIFY_FAILED是什么意思?
在 TLS 握手期间,网站会发送证书链。您的客户端会将它与受信任机构列表(信任存储)核对,并检查名称和日期。如果任何检查失败,则会停止。
通过 CONNECT 隧道,代理会原样转发握手内容,因此您看到的证书就是网站本身的。通常造成问题的是插入了自身证书的检测软件,或您机器上的陈旧信任存储。
在Python、curl、Node.js和浏览器中CERTIFICATE_VERIFY_FAILED是什么样?
每个工具中相同的失败会有不同的提示信息。请在日志中搜索以下信息:
- Python:
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate - Node.js:
UNABLE_TO_GET_ISSUER_CERT_LOCALLY或SELF_SIGNED_CERT_IN_CHAIN - curl:
curl: (60) SSL certificate problem: unable to get local issuer certificate - 浏览器:
NET::ERR_CERT_AUTHORITY_INVALID
导致CERTIFICATE_VERIFY_FAILED的原因是什么?
最可能的首要原因:
- 过时的 CA 包,例如 Python 中的旧版
certifi包。 - 由杀毒软件、公司防火墙或调试代理执行的 HTTPS 检测,它们会使用自己的证书。
- 系统时钟错误,使得有效证书看起来已过期或尚未生效。
- 证书链断裂的网站,缺少中间证书。
- 无系统 CA 证书包的容器镜像。
如何一步步诊断CERTIFICATE_VERIFY_FAILED?
- 在无需代理的情况下运行相同请求。如果仍失败,说明代理无关。
- 用
openssl s_client或 curl-v打印证书颁发者:若颁发者名字是您的杀毒或防火墙,说明被拦截。 - 检查系统日期和时间。
- 更新 CA 包并再次测试。
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URL如何修复CERTIFICATE_VERIFY_FAILED?
- 更新
certifi(pip install -U certifi)或系统 CA 包。 - 如网络需要检测,添加公司检测证书到信任存储,或在不经过该网络的环境中运行爬虫。
- 用网络时钟同步修正系统时钟。
- 在轻量容器镜像中安装 CA 证书包,例如
ca-certificates包。 - 不要在发送凭证或采集关键数据的代码中禁用验证。
遇到CERTIFICATE_VERIFY_FAILED后要重试吗?
不要重试:相同的信任存储会一再失败。修复信任存储、时钟或网络路径后再运行。
SSL: CERTIFICATE_VERIFY_FAILED如何应用于CrawlRelay?
CrawlRelay 的 HTTP 端口通过 CONNECT 隧道传递 HTTPS,因此客户端验证的证书即为网站自身。如果错误只通过网关出现,且无代理时不出现,请提供目标主机名和完整错误联系支持,我们将检查出口。
网关:gw.crawlrelay.com,端口7777(通过CONNECT的HTTP、HTTPS)和端口7778(SOCKS5)。用户名格式:USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}。相关内容:SSL: WRONG_VERSION_NUMBER · 连接重置 · Python 指南。
SSL: CERTIFICATE_VERIFY_FAILED:开发者常问的问题
代理会导致 SSL 证书错误吗?
拦截代理会导致,因为它会用自己的证书代替。CONNECT 隧道代理不会,因为它只转发加密字节,永远不接触握手内容。无需代理运行相同请求:若错误依旧,原因在您的机器或网络。
verify=False 对抓取是否安全?
不作为修复方法。它隐藏了拦截和链断,攻击者可能读取或篡改您的流量,包括令牌和 Cookie。仅用于快速本地测试,切勿在无人值守任务或发送凭证时使用。
为什么 Docker 中失败,但我笔记本上能成功?
轻量容器镜像常不含 CA 证书,无法验证证书。请安装系统 CA 包,或依赖 Python 的 certifi 包。也请检查容器系统时钟是否正确。
本参考中的其他代理错误
HTTP 状态码
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
浏览器和客户端错误
连接和 TLS 错误
带有涵盖失败案例文档的住宅代理
来自US$0.50/GB的CrawlRelay住宅代理,流量永不过期。