如何仅使用指定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
相关产品推荐
相关产品推荐

