ssl新闻资讯

文档中心

Python鐖櫕濡備綍缁曡繃HTTPS璇佷功楠岃瘉锛?绉嶆柟娉曡В鍐充笉甯﹁瘉涔TTPS闅鹃

时间 : 2025-09-27 16:31:47浏览量 : 4

2Python鐖櫕濡備綍缁曡繃HTTPS璇佷功楠岃瘉锛?绉嶆柟娉曡В鍐充笉甯﹁瘉涔TTPS闅鹃

在网络安全领域,HTTPS协议通过SSL/TLS证书确保数据传输的加密和身份认证。但Python爬虫开发者常遇到一个问题:目标网站使用自签名证书、过期证书或配置错误的HTTPS,导致`requests`等库直接报错(如`SSL: CERTIFICATE_VERIFY_FAILED`)。如何安全地绕过证书验证?本文将用实际代码示例解析3种解决方案,并分析其风险与适用场景。

一、为什么Python会拒绝“不带证书”的HTTPS?

当Python发起HTTPS请求时,默认会验证服务器证书的合法性(比如是否由受信任机构签发、是否过期、域名是否匹配)。如果证书无效,客户端会终止连接以防止中间人攻击(MitM)。例如:

```python

import requests

response = requests.get("https://self-signed.badssl.com")

自签名证书网站

报错:requests.exceptions.SSLError: certificate verify failed

```

二、方法1:全局关闭证书验证(不推荐)

通过设置`verify=False`可跳过所有HTTPS验证:

requests.get("https://expired.badssl.com", verify=False)

风险

- 数据泄露:攻击者可伪造服务器窃取敏感信息(如登录凭证)。

- 合规问题:违反GDPR等数据保护法规。

适用场景:仅用于测试环境或完全信任的内部网络。

三、方法2:自定义CA证书(推荐方案)

若目标网站使用私有CA或自签名证书,可将该CA证书添加到本地信任链:

requests.get("https://internal.company.com", verify="/path/to/company_ca.crt")

操作步骤

1. 从网站管理员处获取CA证书文件(.crt或.pem格式)。

2. 在代码中指定该文件路径。

优势

- 保持加密通信的同时兼容私有证书。

- 避免完全关闭安全校验。

四、方法3:修改默认信任库(平衡方案)

Python使用系统或内置的`certifi`库作为根证书库。可通过以下方式扩展信任范围:

import certifi

将自定义CA追加到默认信任库

with open("/path/to/custom_ca.crt", "rb") as f:

custom_ca = f.read()

with open(certifi.where(), "ab") as f:

f.write(custom_ca)

正常请求会自动包含新增的CA

response = requests.get("https://custom-ca-site.com")

适用场景:需要长期访问特定私有服务的生产环境。

五、安全警告与最佳实践

1. 绝不处理金融/医疗数据时禁用验证:此类场景必须使用有效证书。

2. 监控日志中的SSL错误:频繁出现`verify=False`可能意味着攻击尝试。

3. 替代方案考虑

- 使用自动化工具(如Let's Encrypt)为内部服务部署免费合法证书。

- 对爬虫目标申请白名单访问权限,避免绕过机制。

六、扩展知识:底层原理与调试技巧

- 调试工具:用`openssl s_client -connect example.com:443 -showcerts`查看服务器证书链。

- 代码层审计:若第三方库禁用验证(如旧版`urllib3`),可通过打补丁强制启用:

import urllib3

urllib3.disable_warnings()

仅隐藏警告,仍需verify=False才能请求

通过合理选择上述方法,开发者能在安全性与灵活性之间取得平衡。记住:“不带证书HTTPS”是高风险操作,务必评估业务需求后再实施!

TAG:python 不带证书https,python的证书,python有没有证书,python权威证书,python有资格证书吗