文档中心
Requests搴揌TTPS璇佷功楠岃瘉璇﹁В灏忕櫧涔熻兘鐪嬫噦鐨勭綉缁滃畨鍏ㄦ寚鍗?txt
时间 : 2025-09-27 16:32:15浏览量 : 2

在网络安全领域,HTTPS证书验证是保护数据传输安全的核心机制之一。Python的`requests`库作为最常用的HTTP客户端工具,其默认行为会验证HTTPS证书的有效性——但很多开发者对此一知半解,甚至因配置不当引发安全隐患。本文将通过通俗易懂的案例,带你彻底搞懂`requests`如何处理HTTPS证书,并给出实际场景中的最佳实践。
一、HTTPS证书是什么?为什么需要验证?
想象你走进一家银行,柜台职员递给你一张“身份证”证明他是真员工。HTTPS证书就像网站的“身份证”,由权威机构(CA)颁发,包含网站域名、有效期等信息。当浏览器或`requests`发起HTTPS请求时,会检查这张“身份证”是否合法:
1. 是否过期(比如2025年的证书今天还能用吗?)
2. 是否被吊销(类似挂失的身份证)
3. 域名是否匹配(证书写着`www.baidu.com`,但实际访问的是`fake.baidu.com`)
如果验证失败,说明对方可能是钓鱼网站或中间人攻击者!此时`requests`默认会抛出`SSLError`拒绝连接。
二、Requests的证书验证行为
1. 默认情况:严格验证
```python
import requests
response = requests.get("https://example.com")
自动验证证书!
```
等价于:
response = requests.get("https://example.com", verify=True)
此时若遇到以下情况会报错:
- 自签名证书(自己造的“身份证”,无CA背书)
- 过期/域名不匹配(比如访问公司内网`https://192.168.1.1`但证书是给`.com`的)
2. 关闭验证(危险!)
response = requests.get("https://example.com", verify=False)
这相当于“不管对方是谁都相信”,仅在测试环境使用!生产环境这样做会导致:
- 中间人攻击风险:黑客可伪造证书窃取你的密码(比如公共WiFi下)。
- 合规问题:金融、医疗等行业严禁此类操作。
三、实际场景解决方案
场景1:公司内网自签名证书
假设内网地址`https://internal-api.com`使用自签证书,两种安全做法:
方案A:手动指定CA公钥
response = requests.get("https://internal-api.com", verify="/path/to/internal-ca.pem")
把内部CA的公钥文件(`.pem`或`.crt`)传给`verify`参数。
方案B:添加到系统信任库
```bash
Linux/Mac将CA公钥添加到系统目录
sudo cp internal-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
之后代码无需特殊处理,和普通网站一样调用即可。
场景2:爬虫遇到老旧网站证书过期
某些老旧网站可能忘记更新证书。若确认并非攻击(比如通过其他渠道核实),可临时关闭验证并记录告警:
try:
response = requests.get("https://legacy-site.com", timeout=5)
except requests.exceptions.SSLError:
logging.warning("SSL certificate expired, proceeding with caution!")
response = requests.get("https://legacy-site.com", verify=False, timeout=5)
四、高级技巧:自定义适配器与客户端证书
1. 双向认证(mTLS)
某些银行API要求客户端也提供证书:
response = requests.get("https://bank-api.com",
cert=("/path/client.crt", "/path/client.key"))
2. 精细化控制
通过适配器调整SSL/TLS版本(比如禁用不安全的TLSv1.0):
from requests.adapters import HTTPAdapter
from urllib3.util.ssl_ import create_urllib3_context
class CustomAdapter(HTTPAdapter):
def init_poolmanager(self, *args, **kwargs):
context = create_urllib3_context()
context.options |= ssl.PROTOCOL_TLSv1_2 | ssl.PROTOCOL_TLSv1_3
kwargs['ssl_context'] = context
super().init_poolmanager(*args, **kwargs)
session = requests.Session()
session.mount("https://", CustomAdapter())
五、与安全建议
| 情景 | 正确做法 | 错误做法 |
||||
| 生产环境访问公网API | `verify=True`(默认) | `verify=False` |
| 企业内网服务 | 添加内部CA到信任库 | 全局关闭验证 |
| 调试本地HTTPS服务 | 使用工具生成可信自签证书 | `verify=False`提交到代码库|
记住原则:
> “除非你能100%确定风险可控,否则永远不要禁用HTTPS验证。”
通过合理配置证书校验机制,你的应用既能保障安全性,又能避免不必要的连接失败。现在就去检查你的代码里有没有裸奔的`verify=False
TAG:requests https证书,https需要什么证书,https需要ssl证书,https需要钱吗,https需要备案吗,https还有必要加密吗,https需要域名吗,申请https证书要多久,https证书怎么配置,https证书有哪些