这个错误 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
包提供的根证书。
- 找到 Python 应用程序文件夹: 通常在
/Applications/Python 3.11/
(版本号可能不同)。 - 执行安装证书的命令: 在该文件夹中找到并双击执行
Install Certificates.command
脚本。这会安装或更新必要的证书链接。 - 重新执行你的 Python 脚本: 再次执行你的代码
Linux
尝试更新系统的 CA 证书:
- Debian/Ubuntu:
sudo apt update && sudo apt install ca-certificates
- CentOS/Fedora/RHEL:
sudo yum update ca-certificates
或sudo dnf update ca-certificates
2 使用 certifi
包提供的证书
certifi
是一个 Python 包,它提供了最新的 Mozilla 受信任 CA 证书包。你可以尝试让 Python 的 SSL 模块明确使用这个证书包。
安装 certifi
:
pip install --upgrade certifi
修改你的 Python 脚本,在 torch.hub.load
之前加入以下代码:
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
之前)加入以下代码:
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 总结
- 优先尝试方案一: 执行
Install Certificates.command
(macOS) 或更新系统 CA 证书 (Linux)。这是最标准和安全的方法。 - 如果方案一无效,尝试方案二: 使用
certifi
来提供证书包。 - 最后的手段(不推荐)是方案三: 完全禁用 SSL 验证,但务必了解其安全风险。
优先尝试方案一,如果问题仍然存在,再尝试方案二。
本文由博客一文多发平台 OpenWrite 发布!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。