爬取网站并向MongoDB插入数据时遭遇SSL证书验证错误
解决SSL证书验证失败问题及最佳实践
问题分析
你遇到的SSLCertVerificationError,核心原因是requests无法完成目标网站的SSL证书链验证——即使手动指定了单个证书仍无效,大概率是证书格式不符合要求,或是缺少必要的中间CA证书。
解决方案
1. 转换证书格式为PEM
你下载的.cer文件通常是DER二进制格式,而requests要求使用PEM文本格式的证书。可以用OpenSSL工具转换:
openssl x509 -inform der -in /Users/rishilboddula/Downloads/cbit.ac.in.cer -out /Users/rishilboddula/Downloads/cbit.ac.in.pem
之后修改代码中的证书路径为转换后的PEM文件:
ca_cert_path = '/Users/rishilboddula/Downloads/cbit.ac.in.pem' req = requests.get('https://www.cbit.ac.in/current_students/acedamic-calendar/', verify=ca_cert_path)
2. 导出完整证书链(转换后仍失败时)
部分网站的证书依赖中间CA节点,仅提供服务器证书无法完成完整验证。可以通过浏览器导出完整证书链:
- 打开目标网站,点击地址栏锁图标 → 查看证书 → 详细信息 → 复制到文件 → 选择「Base64编码的X.509(.CER)」格式,保存后将后缀改为
.pem。 - 确保导出的文件包含根CA、中间CA、服务器证书的完整链条,再将该文件作为
verify参数的路径。
3. 临时绕过验证(仅应急测试用)
如果是测试场景,可临时禁用SSL验证,但生产环境绝对禁止,会暴露在中间人攻击风险下:
import requests import urllib3 from bs4 import BeautifulSoup import pymongo # 关闭不安全请求警告 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 跳过SSL验证 req = requests.get('https://www.cbit.ac.in/current_students/acedamic-calendar/', verify=False) # 后续爬取与MongoDB插入逻辑不变 soup = BeautifulSoup(req.content, 'html.parser') links = soup.find_all('a') urls = [link.get('href') for link in links] client = pymongo.MongoClient('mongodb://localhost:27017') db = client["data"] ull = db["ull"] for url in urls: ull.insert_one({"url": url})
Python处理SSL验证的最佳实践
- 优先依赖系统默认CA池:
requests会自动加载系统内置的CA证书(如Linux的/etc/ssl/certs、macOS的钥匙串),绝大多数公开网站无需手动配置即可正常验证。 - 手动指定证书需保证完整性:必须指定证书时,一定要使用包含完整链条的PEM格式文件,避免仅提供服务器证书。
- 禁用验证是最后手段:仅在测试或完全信任的内部网络环境中使用,禁止在生产环境启用。
- 用环境变量配置CA:设置
REQUESTS_CA_BUNDLE环境变量指向CA证书文件,无需在代码中硬编码路径,配置更灵活。
内容的提问来源于stack exchange,提问作者Boddula Rishil
相关产品推荐
相关产品推荐

