ssl.SSLCertVerificationError报错解决方案

这个错误 ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate 指出 Python 在尝试建立安全的 HTTPS 连接时,无法验证远程服务器(在此案例中是 GitHub 或 Hugging Face Hub,用来下载模型)的 SSL 证书。这通常是因为你的系统缺少必要的根证书或证书存储区设置不正确。

torch.hub.load 在后台会使用 Python 的 urllib 来下载文件,而 urllib 依赖操作系统的 SSL 功能来验证证书。

你代码中加入的 trust_repo=True 参数是用来信任存储库中的代码 ,而不是用来解决 SSL 连接 的证书验证问题,所以它无法解决这个特定的 SSLCertVerificationError

如下常见解决方案,可依次尝试:

1 安装或更新证书 (最推荐,尤其macOS)

macOS

Python 安装程序(特别是从 python.org 下载的版本)通常会包含一个脚本来安装 certifi 包提供的根证书。

  1. 找到 Python 应用程序文件夹: 通常在 /Applications/Python 3.11/ (版本号可能不同)。
  2. 执行安装证书的命令: 在该文件夹中找到并双击执行 Install Certificates.command 脚本。这会安装或更新必要的证书链接。
  3. 重新执行你的 Python 脚本: 再次执行你的代码

Linux

尝试更新系统的 CA 证书:

  • Debian/Ubuntu: sudo apt update && sudo apt install ca-certificates
  • CentOS/Fedora/RHEL: sudo yum update ca-certificatessudo dnf update ca-certificates

2 使用 certifi 包提供的证书

certifi 是一个 Python 包,它提供了最新的 Mozilla 受信任 CA 证书包。你可以尝试让 Python 的 SSL 模块明确使用这个证书包。

安装 certifi

bash 复制代码
pip install --upgrade certifi

修改你的 Python 脚本,在 torch.hub.load 之前加入以下代码:

python 复制代码
import ssl
import certifi
import os

# --- 新增的代码 ---
# 设置 SSL 使用 certifi 提供的证书路径
# 有些库会检查环境变量
os.environ['SSL_CERT_FILE'] = certifi.where()
os.environ['REQUESTS_CA_BUNDLE'] = certifi.where() # 如果有使用 requests 库

# 尝试修改默认的 SSL context,让 urllib 使用 certifi
try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # 旧版 Python 默认不验证 HTTPS 证书
    pass
else:
    # Monkey patch(猴子补丁)默认的 context 创建函数
    # 来使用 certifi 的 CA 包。
    try:
        # 使用 certifi 的证书来创建默认的 HTTPS context
        ssl._create_default_https_context = lambda: ssl.create_default_context(cafile=certifi.where())
        print("已成功配置 SSL context 使用 certifi。")
    except Exception as e:
        print(f"使用 certifi 配置 SSL context 时出错: {e}")
        print("将回退到可能未经验证的 context(安全性较低)。")
        # 如果上面的方法失败 (例如在某些环境下),作为备选方案可以禁用验证,但不推荐
        # ssl._create_default_https_context = _create_unverified_https_context
# --- 新增代码结束 ---

import torch

# 预训练模型来源
source = 'huggingface/pytorch-transformers'
# 选定加载模型的哪一部分, 这里是模型的映射器
part = 'tokenizer'
# 加载的预训练模型的名字
model_name = 'bert-base-chinese'

# 添加 trust_repo=True 参数以避免『代码』的信任问题,与 SSL 无关
try:
    print(f"正在从 '{source}' 加载 tokenizer '{model_name}'...")
    tokenizer = torch.hub.load(source, part, model_name, force_reload=False, trust_repo=True)
    print("Tokenizer 加载成功。")
    # 在这里可以加上使用 tokenizer 的示例
    # text = "你好,世界!"
    # encoded_input = tokenizer(text, return_tensors='pt')
    # print(encoded_input)
except Exception as e:
    print(f"执行 torch.hub.load 时发生错误: {e}")
    import traceback
    traceback.print_exc() # 打印详细的错误追踪信息

重新执行你的 Python 脚本。

3 完全禁用 SSL 验证 (不建议,有安全风险)

警告: 这个方法会让你的 Python 程序在进行所有 HTTPS 连接时都不验证服务器证书,这会让你容易受到中间人攻击。只应在完全了解风险且无法使用前两种方法时,或在受信任的内部网络环境中临时使用。

在你的脚本开头(import torch 之前)加入以下代码:

Python 复制代码
import ssl

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # 旧版 Python 默认不验证 HTTPS 证书
    pass
else:
    # 创建一个未经验证的 SSL context
    ssl._create_default_https_context = _create_unverified_https_context
    print("警告:已全局禁用 SSL 证书验证。这是不安全的。")

import torch
# ... (你原来的代码) ...

4 总结

  1. 优先尝试方案一: 执行 Install Certificates.command (macOS) 或更新系统 CA 证书 (Linux)。这是最标准和安全的方法。
  2. 如果方案一无效,尝试方案二: 使用 certifi 来提供证书包。
  3. 最后的手段(不推荐)是方案三: 完全禁用 SSL 验证,但务必了解其安全风险。

优先尝试方案一,如果问题仍然存在,再尝试方案二。

本文由博客一文多发平台 OpenWrite 发布!

相关推荐
_深海凉_22 分钟前
LeetCode热题100-颜色分类
python·算法·leetcode
AC赳赳老秦44 分钟前
OpenClaw email技能:批量发送邮件、自动回复,高效处理工作邮件
运维·人工智能·python·django·自动化·deepseek·openclaw
zhaoshuzhaoshu1 小时前
Python 语法之数据结构详细解析
python
AI问答工程师1 小时前
Meta Muse Spark 的"思维压缩"到底是什么?我用 Python 复现了核心思路(附代码)
人工智能·python
zfan5202 小时前
python对Excel数据处理(1)
python·excel·pandas
小饕2 小时前
我从零搭建 RAG 学到的 10 件事
python
老歌老听老掉牙2 小时前
PyQt5+Qt Designer实战:可视化设计智能参数配置界面,告别手动布局时代!
python·qt
格鸰爱童话3 小时前
向AI学习项目技能(六)
java·人工智能·spring boot·python·学习
悟空爬虫-彪哥3 小时前
VRChat开发环境配置,零基础教程
python
数据知道3 小时前
《 Claude Code源码分析与实践》专栏目录
python·ai·github·claude code·claw code