You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

爬取网站并向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:47:30