Jupyter中HTTPS API SSL验证失败需先定位原因:证书链缺失、域名不匹配或已过期;推荐方案为升级certifi并设SSL_CERT_FILE环境变量,或追加证书到certifi路径,禁用验证仅限本地调试。

在Jupyter Notebook中调用HTTPS API时提示SSL证书验证失败,说明Python环境无法验证服务器返回的SSL证书链,常见于内网服务、自签名证书或系统证书库陈旧。必须定位具体原因再修改代码,不能盲目关闭验证。
先确认错误类型和来源
运行以下代码捕获完整错误信息:
import requests
try:
requests.get("https://your-api-domain.com", timeout=5)
except Exception as e:
print(type(e).__name__ + ":", e)
先盯住报错信息的最后几句,往往一眼就能定位问题出在哪儿:如果里面出现“unable to get local issuer certificate”,通常就是根证书或中间证书缺失;如果写着“hostname doesn't match”,那就表示域名和证书对不上;要是看到“certificate has expired”,情况也很直接,就是证书已经过期了。
方法一:临时跳过验证(仅限本地开发调试)
这一步操作起来很简单,直接在请求中加verify=False参数即可。
import requests
response = requests.get("https://your-api-domain.com", verify=False)
【警告】此操作会完全绕过TLS身份认证和数据完整性校验,生产环境绝对禁止使用。
为避免警告刷屏,可追加一行抑制输出:
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
方法二:指定可信证书路径(推荐用于测试/内网环境)
第一步:获取当前certifi证书路径
import certifi
print(certifi.where())
第二步:将目标API的根证书或中间证书(.crt或.pem格式)内容追加到该文件末尾。用文本编辑器打开certifi路径下的cacert.pem,把新证书粘贴在文件最底部,保存。
第三步:在Notebook中显式使用该证书文件
import requests
response = requests.get("https://your-api-domain.com", verify=certifi.where())
如果证书是单独保存的(比如./my-ca-bundle.pem),就直接填绝对路径:
verify="/full/path/to/my-ca-bundle.pem"
方法三:强制Python加载最新证书(解决90%系统级证书陈旧问题)
① 升级certifi包:
!pip install --upgrade certifi --user
② 获取升级后证书路径:
import certifi
cert_path = certifi.where()
print("新证书路径:", cert_path)
③ 设置环境变量使Python全局生效(Notebook重启前必须执行):
import os
os.environ['SSL_CERT_FILE'] = cert_path
④ 验证是否生效:
import ssl
paths = ssl.get_default_verify_paths()
print("当前信任路径:", paths.openssl_cafile or paths.cafile)
若输出与cert_path一致,后续所有requests请求自动使用新证书,无需修改每处代码。
