文档中心
Requests搴撳浣曡幏鍙朒TTPS鏍硅瘉涔︼紵涓€鏂囨悶鎳侾ython瀹夊叏閫氫俊鏈哄埗
时间 : 2025-09-27 16:32:17浏览量 : 3

在网络安全领域,HTTPS通信的安全性依赖于数字证书体系。当我们用Python的`requests`库访问HTTPS网站时,背后其实经历了一场“证书信任链”的验证。本文将用通俗易懂的方式,结合具体场景,带你理解`requests`如何获取并验证HTTPS根证书。
一、HTTPS证书链的本质:像查户口一样验证身份
想象你要去银行办业务,柜员会要求你出示身份证+户口本+派出所证明。HTTPS的证书链验证也是类似的逻辑:
- 末端证书:网站本身的证书(相当于你的身份证)
- 中间证书:颁发机构的分支证书(相当于派出所证明)
- 根证书:顶级CA机构的证书(相当于公安部存档)
`requests`库需要找到可信的“公安部名单”(根证书),才能确认整个链条可信。
二、Requests默认从哪里获取根证书?
场景1:使用系统内置证书库(最常见)
```python
import requests
response = requests.get("https://example.com")
```
此时`requests`会自动调用操作系统或`certifi`库的根证书:
- Linux/macOS:通常读取`/etc/ssl/certs`
- Windows:调用系统加密API
- certifi后备方案:Python包自带的Mozilla CA列表
?? *真实案例*:某企业内网爬虫突然报错`SSL: CERTIFICATE_VERIFY_FAILED`,原因正是服务器更新了中间证书,但本地系统CA库未同步。
场景2:手动指定根证书文件
requests.get("https://example.com", verify="/path/to/custom_root.pem")
这在以下情况特别有用:
- 测试环境使用自签名证书
- 企业内网私有CA体系
三、深度技术点:Certificate Bundle的秘密
实际请求时,客户端需要完整的CA链条。现代服务器通常会通过OCSP Stapling技术将中间证书记录在TLS握手过程中发送,但根证书永远不会传输——因为它必须预先存在于客户端。
?? *抓包示例*:
用Wireshark观察访问https://google.com的握手过程:
1. Server Hello中包含谷歌的末端证书
2. Certificate消息追加了Google Trust Services中间证
3. 但没有GlobalSign根证(因为客户端应该已有)
四、企业级问题排查指南
故障1:缺少中间证书导致失败
错误现象:
SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed...
? 解决方案:
方法1:更新certifi包
pip install --upgrade certifi
方法2:手动合并缺失的中间证到verify路径
with open("custom_bundle.pem", "wb") as f:
f.write(requests.certs.where().read_bytes())
f.write(b"\n--新增的中间证--\n")
故障2:自签名证书场景
临时关闭验证(仅限测试环境!)
requests.get("https://internal.site", verify=False)
正确做法是加载私有CA证:
requests.get("https://internal.site", verify="/path/to/company_root.pem")
五、安全工程师的建议黄金法则
1. 永远不要禁用验证
`verify=False`相当于不检查对方身份证就转账
2. 及时更新CA库存
```bash
Ubuntu示例更新命令
sudo update-ca-certificates --fresh
```
3. 关键系统使用Certificate Pinning
```python
只信任特定指纹的证书记录指纹(SHA256)
pinned_certs = {
'example.com': 'A1:B2:C3...'
}
与SEO关键词呼应
理解`requests获取https根证书`的原理,是Python开发者构建安全应用的必修课。无论是爬虫开发还是API调用,正确处理CA信任链能有效防范中间人攻击。记住——安全的本质不是复杂的技术堆砌,而是对每一个细节的正确把控。
TAG:requests 获取https根证书,