文档中心
Python鐖櫕濡備綍缁曡繃HTTPS璇佷功楠岃瘉锛?绉嶆柟娉曡瑙d笌椋庨櫓璀︾ず
时间 : 2025-09-27 16:31:47浏览量 : 3

大家好!我是专注网络安全的老李。今天咱们聊一个Python爬虫开发中经常遇到的"头疼问题"——HTTPS证书验证。就像你去银行办事要出示身份证一样,HTTPS证书就是网站的"身份证",但有时候这个验证机制会把我们的爬虫挡在门外...
一、HTTPS证书究竟是什么?
想象你走进一家银行,柜员让你出示身份证(SSL证书),同时他也会拿出自己的工作证(服务器证书)给你看。这就是HTTPS的"双向认证"过程:
1. 网站证书:由CA机构颁发,好比公安局发的身份证
2. 根证书:预装在操作系统里的受信列表,就像公安局备案信息
3. 握手过程:
```python
简化的SSL握手伪代码
client -> server: "我要安全连接"
server -> client: "这是我的证书(含公钥)"
client 检查证书有效性:
if 签发机构可信 and 域名匹配 and 未过期:
生成临时密钥(会话密钥)
用服务器公钥加密后发送
else:
断开连接(抛SSLError)
```
二、Python爬虫常见的5种证书错误场景
场景1:自签名证书(自家印的"工作证")
```python
import requests
response = requests.get("https://内部系统.local")
报错:SSLError(CertificateError)
```
就像公司自制工牌,银行当然不认!
场景2:过期证书(过期身份证)
urllib3.exceptions.SSLError: certificate has expired
2025年9月Let's Encrypt根证书过期就导致大规模故障
场景3:域名不匹配(借别人身份证)
访问`https://192.168.1.1`但证书是给`domain.com`颁发的
场景4:中级CA不被信任(小县城公安局开的证明)
缺少中间证书链时会出现:
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]
场景5:SSL/TLS版本不兼容(说方言听不懂)
老系统可能只支持TLS1.0(已被现代浏览器禁用)
三、5种绕过验证的方法与风险对比
| 方法 | 代码示例 | 风险等级 | 适用场景 |
||--|-||
| verify=False | `requests.get(url, verify=False)` | ??火山级 | 临时测试 |
| 自定义CA_BUNDLE | `verify='/path/to/cacert.pem'` | ??高山级 | 企业内网 |
| SSL上下文忽略验证 | `ssl._create_unverified_context()`| ??海啸级 | Python2兼容 |
| monkey patch | `urllib3.disable_warnings()` | ??警报级 | 开发环境 |
| certifi自定义信任库 | `pip install --upgrade certifi` | ?丘陵级 | CA更新滞后 |
??血泪教训:某电商公司因长期使用`verify=False`,导致爬虫被中间人攻击,泄露了200万用户数据!
四、安全工程师的正确姿势
?推荐方案1:正确安装根证书(Debian/Ubuntu示例)
```bash
sudo cp my_ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
检查是否生效:
import ssl
for cert in ssl.get_default_verify_paths().cafile:
print(cert)
?推荐方案2:代码级CA指定(Docker环境常用)
session = requests.Session()
session.verify = '/etc/ssl/certs/ca-certificates.crt'
?推荐方案3:自动化证书管理(推荐库):
from certvalidator import CertificateValidator
validator = CertificateValidator('server.crt', 'intermediate.crt')
result = validator.validate_usage(key_usage=['digital_signature'])
五、高级防御技巧
1. 钉钉Certificate Pinning:
import hashlib
cert_pin = hashlib.sha256(public_key).digest()
if current_cert != cert_pin:
raise Exception("MITM攻击!")
2. 动态CA检测脚本:
def check_ca_updates():
from datetime import datetime
crt = ssl.get_server_certificate(('github.com',443))
not_after = crt.not_valid_after
if not_after < datetime.now():
alert("即将过期的证书!")
六、 checklist
当你的爬虫遇到SSL错误时,请按顺序检查:
1. [ ] 是否是合法网站?(别爬到黑产站去了)
2. [ ] curl命令能否访问?(排除环境问题)
3. [ ] OpenSSL是否能验证?(`openssl s_client -connect`)
4. [ ] Python环境CA路径是否正确?
5. [ ] 最后才考虑关闭验证并评估风险!
记住老李的忠告:"关掉HTTPS验证就像拆掉防盗门——数据泄露时别哭!"。有具体问题欢迎留言讨论~
TAG:python https证书,有什么关于python资格认证,python institute官方推出的证书,python证书在哪里报考,python ca证书,pythom证书