ssl新闻资讯

文档中心

Requests搴揌TTPS璇佷功楠岃瘉璇﹁В灏忕櫧涔熻兘鐪嬫噦鐨勭綉缁滃畨鍏ㄦ寚鍗?txt

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

2Requests搴揌TTPS璇佷功楠岃瘉璇﹁В灏忕櫧涔熻兘鐪嬫噦鐨勭綉缁滃畨鍏ㄦ寚鍗?txt

在网络安全领域,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证书有哪些