文档中心
Requests搴揝SL璇佷功楠岃瘉璇﹁В缃戠粶瀹夊叏涓殑韬唤璇佹鏌ユ満鍒?txt
时间 : 2025-09-27 16:32:16浏览量 : 2

当你用Python的Requests库访问一个HTTPS网站时,背后其实发生了一场严格的"身份证"核验过程。这个"身份证"就是SSL证书,而Requests库默认会像机场安检一样严格检查它。作为网络安全从业者,今天我就用最通俗的语言带你理解这套机制,并分享几个实际工作中的血泪案例。
一、SSL证书是什么?为什么需要验证?
想象你要给银行转账,网站上挂着个牌子写着"我是工商银行",你怎么确认它不是骗子伪装的?SSL证书就像网站的营业执照:
1. 由CA机构颁发(相当于公安局)
2. 包含域名信息(就像营业执照上的公司名称)
3. 有加密签名(类似防伪水印)
如果跳过验证会发生什么?来看个真实案例:
```python
危险示范!千万不要在生产环境这样写!
requests.get('https://yourbank.com', verify=False)
```
某金融公司实习生因为加了`verify=False`,导致程序连到了黑客伪造的钓鱼网站,泄露了所有客户的API密钥。
二、Requests的证书验证行为拆解
默认情况下,Requests会做三重检查:
1. 证书链校验:检查证书是否由受信任的CA签发
- 就像你查营业执照要看看发证机关是不是真的工商局
2. 域名匹配:核对证书中的域名和访问地址是否一致
- 比如访问www.baidu.com却拿到taobao.com的证书
3. 有效期检查:确保证书在有效期内
测试代码示例:
import requests
正常情况(隐式验证)
r = requests.get('https://github.com')
自动使用系统CA存储
显式指定CA包路径(适合容器环境)
r = requests.get('https://github.com', verify='/etc/ssl/certs/ca-certificates.crt')
三、开发环境常见问题解决方案
很多同学在公司内网开发时会遇到这样的报错:
SSLError: HTTPSConnectionPool(host='internal.api', port=443):
Max retries exceeded with url: /v1/users (Caused by SSLError(
SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED]
certificate verify failed: self signed certificate in certificate chain (_ssl.c:1129)')))
这时候正确的处理姿势是:
方案1:将内部CA添加到信任链(推荐)
步骤:把公司CA证书保存为.pem文件
session = requests.Session()
session.verify = '/path/to/company_ca.pem'
方案2:局部禁用验证(仅测试环境!)
requests.get('https://internal.api', verify=False)
曾经有运维同学在Jenkins脚本里永久关闭验证,结果上线后所有流水线都接受了伪造证书,导致打包系统被植入木马。
四、高级防护技巧
1. 证书钉扎(Certificate Pinning)
就像只认某张特定的身份证:
```python
import requests_fingerprint_adapter
session = requests.Session()
session.mount('https://critical.api', requests_fingerprint_adapter.FingerprintAdapter(
'A0:B1:C2...'
预置的正确指纹
))
```
某电商APP曾因未做钉扎,遭遇中间人攻击被篡改商品价格。
2. 双向认证(mTLS)
服务器也要验证客户端的证书:
requests.get(
'https://bank-api',
cert=('/path/client.crt', '/path/client.key')
)
这就像进金库不仅要查保安的证件,保安也要查你的门禁卡。
五、运维监控建议
在企业级环境中建议:
1. 定期扫描所有代码库中的`verify=False`
2. 使用HashiCorp Vault动态管理证书
3. ELK日志中监控SSL错误报警
去年某次安全审计中,我们通过grep发现23处未经验证的请求调用,其中5个指向生产环境的外部API接口。
来说,Requests的SSL验证就像网络世界的守门人。记住三个原则:①能用验证就用验证;②特殊需求明确指定CA;③永远不要全局禁用验证。你的每个安全决策都在为整个系统增加或减少一道防线。
TAG:requests ssl证书,https的ssl证书,ssl证书申请验证方法,ssl要求证书怎么办