requests.post(url, json=body,
verify='/etc/ssl/certs/partner-ca.pem', timeout=5)
对接第三方支付的内网客户端里写着 requests.post(url, verify=False),代理替换成自签证书照样握手成功,订单金额被改掉也照常返回。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,verify=False 直接跳过服务端证书链和主机名校验,任何持有证书的中间人都能伪装成目标。抓包工具装个根证书就能解密。代码里通常还带着 urllib3 的告警被忽略掉。
「requests 关闭证书校验」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
处理上按这个顺序:去掉 verify=False 把对方根证书放进信任库;内部自签场景用 verify 指向 CA 文件 别整体关掉;requests 升到默认开启校验的版本 关掉警告抑制;在 CI 里搜一遍 verify=False 和 InsecureRequestWarning 的忽略。
改完只确认一件事:开代理抓包握手直接失败 正常链路请求返回 200 响应时间和之前差不多。
