文档中心
Requests搴撳浣曞畨鍏ㄦ浛鎹SL璇佷功锛?涓湡瀹炴渚嬫暀浣犻伩鍧?txt
时间 : 2025-09-27 16:32:17浏览量 : 1

在网络安全领域,SSL/TLS证书就像网站的"身份证",而Python的`requests`库则是我们与网站交互的"快递员"。当证书出现问题时,直接禁用验证(`verify=False`)相当于让快递员不检查收件人身份证——危险至极!本文将通过3个真实场景,手把手教你如何安全替换证书。
一、为什么不能简单粗暴用`verify=False`?
```python
危险示范!相当于不锁车门就离开
response = requests.get("https://bank.com", verify=False)
```
风险案例:2025年某金融APP因禁用证书验证,导致中间人攻击泄露2000+用户数据。攻击者只需在公共WiFi部署伪造证书,就能窃取所有API请求。
正确姿势:应当像海关严格核对护照一样校验证书:
指定可信CA证书包路径(类似海关白名单)
requests.get("https://bank.com", verify="/path/to/cacert.pem")
二、3种必须替换证书的场景及解决方案
场景1:企业内网自签名证书
案例:某制造业ERP系统使用内部CA颁发的证书,直接访问会报`SSLError`。
解决方案——把"内部护照"加入信任列表:
import requests
方式1:单独加载证书(适合临时测试)
response = requests.get("https://internal-erp",
verify="/path/to/company_root_ca.crt")
方式2:永久添加到certifi库(生产环境推荐)
找到certifi所在路径:python -c "import certifi; print(certifi.where())"
将企业根证书追加到该文件末尾
场景2:CDN导致证书变更
案例:某电商网站使用Cloudflare CDN后,发现Python脚本报错`Certificate did not match expected hostname`。
根本原因:CDN的SAN(Subject Alternative Name)可能不包含源站域名。
解决方案——自定义匹配规则:
from requests.adapters import HTTPAdapter
from urllib3.util.ssl_ import create_urllib3_context
class CustomHostnameSSLAdapter(HTTPAdapter):
def init_poolmanager(self, *args, **kwargs):
context = create_urllib3_context()
context.check_hostname = False
关闭默认主机名验证
kwargs['ssl_context'] = context
super().init_poolmanager(*args, **kwargs)
session = requests.Session()
session.mount("https://", CustomHostnameSSLAdapter())
response = session.get("https://cdn.example.com", verify=True)
仍校验CA链
场景3:应急情况下的临时换证
案例:安全团队发现当前CA提供商被入侵,需要紧急切换验证链。
标准操作流程(SOP):
1. 从新CA提供商下载PEM格式的根证书和中间证书
2. 创建临时验证链文件:
```bash
cat new_root.crt new_intermediate.crt > emergency_chain.pem
```
3. 代码中动态切换:
```python
config.py中定义可配置路径
CERT_CHAIN_PATH = os.getenv("CERT_CHAIN", "/default/path")
requests调用时读取配置
requests.post(api_endpoint, verify=CERT_CHAIN_PATH)
三、高级技巧:内存中的证书管理
对于需要动态加载证书的场景(如从数据库读取),可以避免写文件:
from io import StringIO
from cryptography.x509 import load_pem_x509_certificate
def get_with_memory_cert(pem_content: str):
Step1: 验证证书有效性(类似检查护照防伪标志)
cert_obj = load_pem_x509_certificate(pem_content.encode())
Step2: 创建临时CA信任库
ca_bundle = StringIO()
ca_bundle.write(requests.certs.where())
默认CA
ca_bundle.write("\n" + pem_content)
追加新证书
Step3: 使用内存中的CA包
return requests.get(
"https://target.com",
verify=ca_bundle.getvalue()
)
【安全自查清单】
每次修改SSL验证逻辑时,务必检查:
1. [ ] HTTPS URL是否写死为HTTP?
2. [ ] TLS版本是否≥1.2?(可通过`urllib3.util.ssl_.DEFAULT_VERSION`设置)
3. [ ] CSRFToken等敏感信息是否随HTTP明文传输?
4. [ ] CA文件权限是否为600?(防止被篡改)
通过以上方法,你既能处理各种SSL异常场景,又能守住安全底线。记住:好的开发者追求功能实现,优秀的安全开发者会多问一句"这样验证够了吗?"。
TAG:requests 替换ssl证书,apache更换ssl证书,配置ssl替换域名,ssl证书替换流程