You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅使用指定CA文件验证,不依赖系统信任CA库?

问题解决:让Requests仅使用指定CA文件验证证书,禁用系统CA

针对Requests库的解决方案

Requests默认会将你指定的CA文件追加到系统默认的信任链中,而非直接替换,这就导致即使自定义CA不正确,系统中的有效证书仍会让请求成功,无法暴露问题。要实现仅信任指定CA,需要手动创建SSL上下文,只加载目标CA文件:

import requests
import ssl

# 创建TLS客户端上下文,不自动加载系统默认CA
ssl_ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
# 仅加载你指定的CA文件
ssl_ctx.load_verify_locations("cert.pem")
# 启用主机名检查,避免安全风险
ssl_ctx.check_hostname = True

# 发送请求时传入这个自定义上下文
try:
    r = requests.get("https://google.com", verify=ssl_ctx, timeout=10)
    r.raise_for_status()
    print("请求成功(指定CA有效)")
except requests.exceptions.SSLError:
    print("请求失败(指定CA无效,符合预期)")

这段代码的核心是直接创建SSLContext实例,绕过Requests的默认合并逻辑,通过load_verify_locations仅加载指定CA,确保验证时只依赖你提供的证书。

针对httpx库的解决方案

httpx的实现更符合直观预期:当你给verify参数传入CA文件路径时,它会仅使用该文件中的证书进行验证,不会合并系统默认信任链。直接使用即可满足需求:

import httpx

try:
    r = httpx.get("https://google.com", verify="cert.pem", timeout=10)
    r.raise_for_status()
    print("请求成功(指定CA有效)")
except httpx.SSLError:
    print("请求失败(指定CA无效,符合预期)")

如果测试环境允许切换到httpx,这是更简洁的方案。

内容的提问来源于stack exchange,提问作者Wyko ter Haar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:20:07