解决 Linux 下 “E: 仓库xxx没有数字签名” 问题
输入命令 sudo apt-get update
后,出现以下警告:
这个错误表明 Ubuntu 系统无法验证阿里云镜像仓库的签名,通常这是由于缺少或过时的 GPG 密钥导致的。以下是解决方法:
目录
- 一、更新 APT 密钥
- 1. 出现错误: 软件包 debian-archive-keyring 没有可安装候选
- 1)修改命令
- 2)直接更新 Ubuntu 密钥(推荐)
- 3)检查网络连接
- 4)检查是否有第三方软件源依赖 debian-archive-keyring
- 2. 出现错误:找不到命令 sudo: apt-key
- 二、更换镜像源
- 三、手动下载密钥
- 四、临时忽略签名验证(不推荐)
- 五、其他
- 1. 由于没有公钥,无法验证下列签名
- 2. 软件源含有互相冲突的值
一、更新 APT 密钥
- 首先尝试更新软件包列表并安装缺失的密钥:
sudo apt update
sudo apt install -y debian-archive-keyring ubuntu-keyring
- 手动下载并添加 Ubuntu 密钥:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
sudo apt update
1. 出现错误: 软件包 debian-archive-keyring 没有可安装候选
这个错误通常是因为 Ubuntu 系统版本较新(如 24.04),而 debian-archive-keyring 可能已经不再默认包含在官方仓库中,或者你的软件源配置有问题。以下是解决方法:
1)修改命令
将 sudo apt install -y debian-archive-keyring ubuntu-keyring
改为 sudo apt install -y ubuntu-keyring
。
2)直接更新 Ubuntu 密钥(推荐)
-
手动添加 Ubuntu GPG 密钥,输入命令:
sudo mkdir -p /etc/apt/keyrings
-
输入下面命令,然后 Ctrl + C 退出
sudo gpg --homedir /tmp --no-default-keyring --keyring /etc/apt/keyrings/ubuntu-archive-keyring.
-
输入命令:
gpg --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
-
运行上述命令后,GPG 会自动保存密钥到本地密钥环,验证密钥是否已导入只需输入命令:
gpg --list-keys 3B4FE6ACC0B21F32
,如果看到类似下列输出,说明导入成功:
pub rsa4096 2012-05-11 [SC]3B4FE6ACC0B21F32
uid [ unknown] Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>
- 更新 APT 并安装 ubuntu-keyring,输入以下命令:
sudo apt update
sudo apt install ubuntu-keyring
如果 gpg 卡住或报错:
- 强制刷新 GPG 密钥服务器:
gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3B4FE6ACC0B21F32
- 检查网络连接:
ping keyserver.ubuntu.com
如果无法访问,尝试更换 DNS(如 8.8.8.8)或使用代理。
- 手动下载并导入密钥:
curl -sSL https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3B4FE6ACC0B21F32 | gpg --import -
后续操作:
-
导入密钥后,确保 APT 能识别它:
sudo apt update
-
如果仍然报错 NO_PUBKEY,可能需要手动导出密钥供 APT 使用:
sudo gpg --export --armor 3B4FE6ACC0B21F32 | sudo apt-key add -
sudo apt update
注意:如果 apt-key 已废弃(Ubuntu 22.04+),改用:
curl -fsSL https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3B4FE6ACC0B21F32 | sudo gpg --dearmor -o /etc/apt/keyrings/ubuntu-archive.gpg
echo "deb [signed-by=/etc/apt/keyrings/ubuntu-archive.gpg] http://archive.ubuntu.com/ubuntu noble main" | sudo tee /etc/apt/sources.list.d/ubuntu-archive.list
sudo apt update
利用
cat /etc/issue
命令查看 Ubuntu 版本。
3)检查网络连接
如果仍然报错,可能是网络问题或镜像源不可用,输入命令:ping archive.ubuntu.com
,如果无法访问,尝试:
-
更换 DNS(如 8.8.8.8 或 1.1.1.1)
-
使用代理(如有必要)
-
等待镜像源恢复
4)检查是否有第三方软件源依赖 debian-archive-keyring
grep -r "debian-archive-keyring" /etc/apt/
如果发现某些 .list 文件引用了它,可以:
-
注释掉相关行(在行首加 #)
-
删除该文件(如果是第三方软件源)
-
联系该软件源维护者,询问是否提供 Ubuntu 24.04 支持
2. 出现错误:找不到命令 sudo: apt-key
使用 GPG 替代 apt-key:由于安全性原因,apt-key 已被弃用,推荐直接使用 GPG 管理密钥。
二、更换镜像源
如果问题持续,建议更换为官方或其他可靠镜像源:
-
备份当前源列表:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
-
编辑源列表:
sudo vim /etc/apt/sources.list
- 将 mirrors.aliyun.com 替换为其他镜像(如 archive.ubuntu.com 或其他国内镜像)
官方源(推荐):
deb http://archive.ubuntu.com/ubuntu noble main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu noble-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu noble-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu noble-security main restricted universe multiverse
国内镜像(如阿里云、清华源):
deb https://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse
- 更新 APT :
sudo apt update
三、手动下载密钥
-
检查网络连接(确保能访问 keyserver.ubuntu.com):
ping keyserver.ubuntu.com
-
手动下载密钥(如果 apt-key 失效):
wget -qO- https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3B4FE6ACC0B21F32 | sudo gpg --dearmor -o /usr/share/keyrings/ubuntu-archive-keyring.gpg
- 清理缓存并重试:
sudo apt clean
sudo apt update
四、临时忽略签名验证(不推荐)
如果急需更新,可以临时忽略签名验证(安全性较低):sudo apt update --allow-insecure-repositories
。
或强制更新(不推荐,仅临时使用):sudo apt update --allow-unauthenticated
。
五、其他
1. 由于没有公钥,无法验证下列签名
如果出现上述问题,解决方法为:从 Ubuntu 的密钥服务器获取并添加缺失的公钥。
- 使用 gpg 从 keyserver 获取密钥:
gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 871920D1991BC93C
此命令将从密钥服务器获取公钥并添加到你的系统中。
- 检查是否成功导入:
gpg --list-keys 871920D1991BC93C
。如果成功,会显示下图所示的类似文本:
pub rsa4096 2018-09-17 [SC]871920D1991BC93C
uid [ unknown] Ubuntu Archive Automatic Signing Key (2018) <ftpmaster@ubuntu.com>
- 导出密钥并添加到 APT 信任列表(Ubuntu 22.04+ 推荐方式):
sudo mkdir -p /etc/apt/keyrings
gpg --export --armor 871920D1991BC93C | sudo tee /etc/apt/keyrings/ubuntu-archive.gpg > /dev/null
- 在 sources.list 中引用该密钥:编辑你的软件源文件(如 /etc/apt/sources.list 或 /etc/apt/sources.list.d/ubuntu.sources):
cd /etc/apt
vim sources.list
写入以下 signed-by 字段:
deb [signed-by=/etc/apt/keyrings/ubuntu-archive.gpg] http://archive.ubuntu.com/ubuntu noble main
i
键进入写模式,Esc
键退出写模式,:wq
保存并退出文件。
- 更新 APT :
sudo apt update
其他方法:手动下载密钥并导入(适用于网络问题)
如果 gpg --keyserver 无法连接,可以手动下载并导入:
- 从 Ubuntu 密钥服务器获取密钥:
curl -sSL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x871920D1991BC93C" | gpg --import -
- 导出并添加到 APT :
gpg --export --armor 871920D1991BC93C | sudo tee /etc/apt/keyrings/ubuntu-archive.gpg > /dev/null
- 更新软件源并验证:
sudo apt update
2. 软件源含有互相冲突的值
错误原因:在 /etc/apt/sources.list 或 /etc/apt/sources.list.d/*.list 中多次指定了不同的 Signed-By 路径。
上述错误是因为你的 APT 软件源配置中 Signed-By 字段引用了多个不同的 GPG 密钥文件,导致冲突。解决方法为:
-
检查冲突的软件源:
grep -r "Signed-By" /etc/apt/
,这会列出所有包含 Signed-By 的配置行,找到冲突的地方。 -
统一使用同一个密钥文件:
# 全部改用 ubuntu-archive.gpg
sudo sed -i 's|/etc/apt/keyrings/ubuntu-archive-2018.gpg|/etc/apt/keyrings/ubuntu-archive.gpg|g' /etc/apt/sources.list /etc/apt/sources.list.d/*.list# 全部改用 ubuntu-archive-2018.gpg
sudo sed -i 's|/etc/apt/keyrings/ubuntu-archive.gpg|/etc/apt/keyrings/ubuntu-archive-2018.gpg|g' /etc/apt/sources.list /etc/apt/sources.list.d/*.list# 手动编辑文件
sudo nano /etc/apt/sources.list
检查并确保所有 Signed-By 指向 同一个密钥文件,例如:
deb [signed-by=/etc/apt/keyrings/ubuntu-archive.gpg] http://archive.ubuntu.com/ubuntu noble main
- 删除多余的密钥文件(可选):如果 ubuntu-archive-2018.gpg 不再需要,使用命令
sudo rm /etc/apt/keyrings/ubuntu-archive-2018.gpg
删除文件,然后确保所有 sources.list 引用的是 ubuntu-archive.gpg 。