ssl新闻资讯

文档中心

Requests搴撲腑HTTPS璇锋眰鐨勮瘉涔﹂獙璇佹満鍒惰瑙o紙闄勫疄鎴樻渚嬶級

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

2Requests搴撲腑HTTPS璇锋眰鐨勮瘉涔﹂獙璇佹満鍒惰瑙o紙闄勫疄鎴樻渚嬶級

当你在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证书