文档中心
Requests搴撲腑HTTPS璇锋眰鐨勮瘉涔﹂獙璇佹満鍒惰瑙o紙闄勫疄鎴樻渚嬶級
时间 : 2025-09-27 16:32:16浏览量 : 3

当你在Python中用`requests`库访问一个HTTPS网站时,背后其实藏着一场"身份证检查"的暗战。今天我们就用大白话+实战案例,拆解HTTPS证书验证的全流程。
一、HTTPS证书是什么?举个现实例子
想象你去银行办业务,柜员要求你出示身份证。HTTPS证书就像网站的"数字身份证",由权威机构(CA)颁发。当你的浏览器访问`https://example.com`时,服务器会先亮出这张"身份证"。
常见证书类型:
- DV证书(域名验证):就像小区门禁卡,只验证域名所有权
- OV证书(组织验证):类似工牌,会验证企业真实信息
- EV证书(扩展验证):好比护照+指纹,会有绿色地址栏显示公司名称
二、Requests如何验证证书?分步拆解
当执行这段代码时:
```python
import requests
response = requests.get("https://example.com")
```
背后发生了这些事:
1. 握手阶段:服务器发送证书链(可能包含中间证书)
2. 有效期检查:确认证书未过期(就像检查身份证有效期)
3. 域名匹配:核对证书中的`Common Name`或`Subject Alternative Name`
4. CA信任链:从根证书开始逐级验证签名
关键参数说明:
关闭验证(危险!仅用于测试)
requests.get("https://example.com", verify=False)
指定自定义CA包路径
requests.get("https://example.com", verify="/path/to/cert.pem")
三、开发中常见的翻车现场
案例1:自签名证书报错
小明在内网测试时遇到:
SSLError: certificate verify failed
这是因为测试环境用了自签证书(就像自己手写的"身份证")。解决方案:
临时方案(不推荐生产环境)
requests.get("https://test.internal", verify=False)
正确方案
requests.get("https://test.internal", verify="/path/to/internal_ca.pem")
案例2:域名不匹配错误
某次上线后出现:
CertificateError: hostname 'api.new.com' doesn't match 'old.com'
这是因为服务器续期证书时忘了更新SAN字段。好比你的工牌印着旧部门名称。
案例3:中间人攻击实验
用mitmproxy抓包时,需要这样配置:
proxies = {"https": "http://127.0.0.1:8080"}
requests.get("https://example.com", proxies=proxies, verify=False)
这模拟了攻击者伪造CA的场景,日常开发中绝对不要禁用verify!
四、高级玩家必备技巧
1. 钉死证书(Certificate Pinning)
像银行VIP的虹膜识别,只认特定指纹:
```python
import hashlib
cert_fingerprint = "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAA="
response = requests.get("https://bank.com", verify=True)
assert hashlib.sha256(response.cert).digest() == cert_fingerprint
```
2. 自定义适配器
比如强制使用TLS1.3:
```python
from requests.adapters import HTTPAdapter
from urllib3.util.ssl_ import create_urllib3_context
class TLS13Adapter(HTTPAdapter):
def init_poolmanager(self, *args, **kwargs):
context = create_urllib3_context()
context.options |= ssl.PROTOCOL_TLSv1_3
kwargs['ssl_context'] = context
return super().init_poolmanager(*args, **kwargs)
s.mount("https://", TLS13Adapter())
五、运维视角的最佳实践
1. 监控证书过期
用Prometheus+blackbox_exporter设置告警规则:
```yaml
- alert: SSLCertExpiringSoon
expr: probe_ssl_earliest_cert_expiry - time() < 86400 *30
30天阈值
labels: severity: critical
2. 自动化续期工具推荐
- Let's Encrypt + certbot自动续期
`certbot renew --quiet --post-hook "systemctl reload nginx"`
- HashiCorp Vault的动态签发能力
一张速查表:
| 场景 | Requests参数配置 | 安全等级 |
||--|-|
| 生产环境 | `verify=True`(默认) | ★★★★★ |
| 企业内网 | `verify="/path/to/ca.pem"` | ★★★★☆ |
| CI/CD测试环境 | `verify=False`+网络隔离 | ★★☆☆☆ |
| 金融级应用 | 证书钉死+双向认证 | ★★★★★★ |
记住:所有禁用SSL验证的操作都应该像对待裸奔一样谨慎!
TAG:requests https 证书,https 证书验证过程,https 证书验证,https证书如何获取,获取https证书