修改 CA 证书包前,先找出失败的是哪次 TLS 握手。代理证书和网站证书可能是在不同连接上验证的。

代理与目标TLS 验证
通过 HTTP 代理访问 HTTPS 目标CONNECT 完成后,通过隧道验证目标证书。
通过 HTTPS 代理访问 HTTPS 目标先验证到代理的 TLS;隧道打开后,再验证单独的目标 TLS 会话。

利用详细跟踪输出,确认请求的主机名和最后一次完成的握手。HTTPS 代理的证书验证可能在联系网站之前就失败。检查该连接预期使用的名称、证书有效期、本地时钟、预期证书链,以及认可的信任库。排查时也要考虑有意配置的 TLS 拦截或额外加入的根证书。

curl 为这两条连接提供了各自的 CA 选项:

curl --proxy https://proxy.example:8443 --proxy-cacert proxy-ca.pem --cacert site-ca.pem https://example.com/

--proxy-cacert 用于指定代理的信任依据;--cacert 用于指定目标站点的信任依据。按你打算采用的信任配置,替换示例端点和文件。如果系统信任已经够用,就不需要自定义证书包。

把主机名换成随意选取的 IP,会改变证书匹配。跳过验证可能掩盖故障,却不能确认对端身份。对于不熟悉的代理,对方要求安装其根 CA,并不足以成为信任它的理由。

端口拒绝连接或 CONNECT 被拒,属于更早的阶段,换证书解决不了。反过来,目标 TLS 验证通过后,网站返回的 HTTP 错误应从已收到的响应入手分析,而不是继续调整 CA。

相关文章