ssl新闻资讯

文档中心

Requests搴撳浣曞畨鍏ㄦ浛鎹SL璇佷功锛?涓湡瀹炴渚嬫暀浣犻伩鍧?txt

时间 : 2025-09-27 16:32:17浏览量 : 1

2Requests搴撳浣曞畨鍏ㄦ浛鎹SL璇佷功锛?涓湡瀹炴渚嬫暀浣犻伩鍧?txt

在网络安全领域,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证书替换流程