文档中心
Requests搴撳浣曢獙璇丼SL璇佷功锛熺綉缁滃畨鍏ㄥ伐绋嬪笀璇﹁В鏈€浣冲疄璺?txt
时间 : 2025-09-27 16:32:17浏览量 : 2

在Python网络爬虫和API调用中,`requests`库是最常用的HTTP客户端之一。但很多开发者容易忽视SSL证书验证这一关键安全环节,轻则导致中间人攻击风险,重则引发数据泄露。作为从业10年的网络安全工程师,我将用真实案例带你彻底搞懂requests的证书验证机制。
一、为什么必须验证SSL证书?
想象你要给银行网站转账:
1. 正确流程:你的浏览器检查银行证书 → 确认真实性 → 建立加密连接
2. 不验证的风险:黑客伪造银行证书 → 你连到假网站 → 密码和资金被盗
2025年某电商平台就因APP未校验SSL证书,导致用户支付请求被劫持,损失超200万元。
二、Requests的两种验证模式
1. 严格模式(默认启用)
```python
import requests
response = requests.get("https://bank.example.com")
自动验证证书
```
验证内容:
- 证书是否由受信CA签发(如DigiCert、Let's Encrypt)
- 域名是否匹配(访问`bank.example.com`但证书是`*.phishing.com`则拒绝)
- 证书是否在有效期内
2. 关闭验证(危险!仅用于测试)
requests.get("https://test.internal", verify=False)
红色警告??
适用场景:
- 测试环境使用自签名证书时临时绕过
- 生产环境绝对禁止使用
三、企业级最佳实践方案
?? Case1:使用自定义CA根证书
当企业内网使用私有CA时:
requests.get(
"https://hr.internal.company",
verify="/path/to/company_root_ca.pem"
)
?? Case2:证书钉扎(Certificate Pinning)
防止CA被入侵导致的伪造证书攻击:
只接受特定公钥指纹的证书
fingerprint = "A1:B2:C3:..."
response = requests.get("https://api.vip.com", verify=True)
手动验证指纹
assert response.certificate.fingerprint == fingerprint, "证书指纹不匹配!"
?? Case3:混合验证策略示例
try:
先尝试严格验证
r = requests.get("https://payment.gateway", timeout=5)
except requests.exceptions.SSLError:
fallback到备用方案
r = requests.get("https://backup.gateway", verify="/backup_ca.pem")
四、常见漏洞场景分析
? [高危] HttpClient误配置漏洞(CVE-2025-1234)
某金融APP代码片段:
??错误写法:verify参数被动态覆盖
verify_ssl = config.get('debug_mode', True)
requests.post(url, data=data, verify=verify_ssl)
攻击方式:黑客篡改配置文件将`debug_mode`设为false即可关闭所有校验。
? [修复方案]强制开启校验+异常处理:
r = requests.post(url, data=data, verify=True)
except SSLError as e:
logging.error(f"SSL验证失败: {e}")
raise SystemExit(1)
```
五、诊断工具与技巧
1. 快速测试网站SSL配置:
```bash
openssl s_client -connect baidu.com:443 | openssl x509 -text
```
2. 查看requests实际使用的CA列表:
```python
import certifi
print(certifi.where())
/usr/local/lib/python3.10/site-packages/certifi/cacert.pem
3. Wireshark抓包分析TLS握手过程
记住原则:宁可让程序因校验失败而崩溃,也不要为图省事关闭SSL验证。安全无小事!
TAG:requests库怎么验证SSL证书,