Requests库的verify=False不安全?深入聊聊Python中HTTPS证书验证的‘正确’关闭姿势

张开发
2026/5/5 16:32:36 15 分钟阅读

分享文章

Requests库的verify=False不安全?深入聊聊Python中HTTPS证书验证的‘正确’关闭姿势
Requests库的verifyFalse不安全深入聊聊Python中HTTPS证书验证的‘正确’关闭姿势当你在Python中使用Requests库发起HTTPS请求时如果遇到自签名证书或内部测试环境的服务可能会不假思索地加上verifyFalse参数来跳过证书验证。这个看似简单的解决方案背后隐藏着哪些安全风险作为开发者我们是否有更优雅的应对方式1. 为什么verifyFalse会引发安全警告每次使用verifyFalse时你都会看到这样的警告InsecureRequestWarning: Unverified HTTPS request is being made to host这个警告不是Requests库的多此一举而是底层urllib3库发出的重要安全提醒。HTTPS的核心安全机制就是证书验证它确保你连接的是真实的服务器而非中间人攻击的伪装者。证书验证的三个关键作用身份认证确认服务器确实是它声称的那个实体数据加密建立安全的通信通道完整性保护防止传输数据被篡改当你设置verifyFalse时相当于关闭了第一道安全防线。虽然数据仍然是加密传输的但你无法确认通信对方的真实身份。这就好比收到一封加密邮件但你完全不知道发件人是谁。2. 禁用验证的三种方式及其风险等级不是所有绕过证书验证的方法都同样危险。让我们比较几种常见做法方法代码示例风险等级适用场景完全禁用验证requests.get(url, verifyFalse)⚠️⚠️⚠️高危绝对不推荐生产环境使用仅禁用警告urllib3.disable_warnings()⚠️⚠️中危临时测试但仍保留验证自定义CA证书verify/path/to/cert.pem⚠️低危内部服务长期解决方案最危险的做法是同时使用这两种代码requests.packages.urllib3.disable_warnings() response requests.get(url, verifyFalse)这相当于不仅关闭了警报系统还拆掉了大门锁。攻击者可以轻松实施中间人攻击而你完全不会收到任何警告。3. 更安全的替代方案3.1 为内部服务配置专用CA证书对于企业内网或开发环境最佳实践是创建自己的CA证书并配置客户端信任该CAimport requests # 指定自定义CA证书路径 response requests.get( https://internal-api.example.com, verify/path/to/company-ca-cert.pem )操作步骤生成自签名CA证书用该CA签发服务器证书将CA证书分发给所有客户端在代码中指定CA证书路径3.2 使用SSLContext进行精细控制对于需要更复杂控制的情况可以直接配置SSLContextimport ssl import requests from urllib3.util.ssl_ import create_urllib3_context # 创建自定义SSL上下文 ctx create_urllib3_context() ctx.load_verify_locations(cafile/path/to/certs.pem) # 仅禁用特定类型的证书验证 ctx.verify_mode ssl.CERT_OPTIONAL response requests.get( https://api.example.com, verifyctx )这种方法允许你混合使用系统证书和自定义证书控制验证深度设置特定的协议版本4. 临时测试的安全实践如果必须在测试环境临时禁用验证至少应该限制只在测试代码中使用添加明显的注释说明确保不会意外提交到生产代码# 测试环境专用 - 生产环境必须移除 # 仅用于访问开发环境的自签名证书 response requests.get( https://dev-api.example.com, verifyFalse # 安全风险仅在测试环境使用 )更好的做法是使用环境变量控制import os import requests VERIFY_SSL os.getenv(VERIFY_SSL, True).lower() true response requests.get( https://api.example.com, verifyVERIFY_SSL )这样可以通过环境变量VERIFY_SSLFalse在测试时禁用验证而生产环境默认保持安全。5. 常见陷阱与最佳实践陷阱1全局禁用警告# 不推荐 - 隐藏所有安全警告 import urllib3 urllib3.disable_warnings()陷阱2错误的自定义证书路径# 文件路径错误会导致静默失败 requests.get(url, verifywrong/path/cert.pem)最佳实践清单生产环境始终启用证书验证为内部服务建立专用CA体系测试代码明确标记临时解决方案监控日志中的安全警告定期更新CA证书包在最近的一个项目中我们遇到旧系统使用的SHA-1签名证书被现代浏览器拒绝的情况。通过分析发现正确的解决方案不是禁用验证而是升级服务器证书。这提醒我们verifyFalse应该是最后手段而非首选方案。

更多文章