文档中心
Python鐖櫕濡備綍缁曡繃HTTPS璇佷功楠岃瘉锛?绉嶆柟娉曡В鍐充笉甯﹁瘉涔TTPS闅鹃
时间 : 2025-09-27 16:31:47浏览量 : 4

在网络安全领域,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有资格证书吗