Debian 软件包签名与 GPG 校验机制
讲清 Debian 源里 Release/InRelease/Packages 的 GPG 签名链、apt 安装时校验什么,以及 NO_PUBKEY 校验失败怎么修。这是软件供应链的最后一道防线。
结论先行
Debian 对每个源的索引文件做 GPG 签名:apt update 时校验发布文件签名,安装时核对包文件校验和。这是软件供应链的「最后一道防线」——校验失败意味着源配置不对或密钥过期,而不是「包坏了」。
签名链条
| 对象 | 谁签 | 保证什么 |
|---|---|---|
| Release 文件 | 对应稳定版的发布密钥(如 Debian 13.7.0 DVD-1 条目 随附的 13 发布密钥) | 整个源目录未被篡改 |
| InRelease | 同上,打包了 Packages 的校验和 | 当前源最常用形态 |
| Packages / 每个 .deb | 维护者/上传者签名 | 包文件内容与声明一致 |
apt 的默认行为
apt update时签名对不上,拒绝使用该源,报NO_PUBKEY(缺密钥)或BADSIG(密钥变更/不匹配)。- 第三方源要用
deb [signed-by=/usr/share/keyrings/xx.gpg](或 deb822 的Signed-By:)显式指定密钥。 - 镜像站是「代管」索引文件与签名,校验失败通常是 URL 写错或代号混用。
Debian 发布密钥会定期轮换,旧密钥环会命中 BADSIG,以发行说明的换钥公告为准。不要图省事加
--allow-unauthenticated。
校验失败怎么修
- 检查
/etc/apt/sources.list(.d)里的源行是否与当前版本(trixie)对应。 sudo apt-get update看具体报错:NO_PUBKEY → 从官方渠道导入密钥;BADSIG → 密钥轮换或混用源。- 第三方源的公钥只从其官方渠道获取,不从来路不明的镜像拷。
- Debian 13.7.0 网络安装版条目 的默认源就是这套机制,换国内镜像后签名链同样要走一遍。
常见误操作
- 用
trusted=yes/--allow-unauthenticated绕过签名——等于关掉最后一道防线。 - 把 testing/unstable 源与 stable 的密钥混用。
- 以为「换了镜像」就要「换密钥」——密钥始终跟随发行方,不跟随镜像。