2026 年还在用 apt-key?快醒醒!apt-key vs signed-by 完整对比与迁移指南
2026 年了,很多老服务器还在跑 Ubuntu 18.04/20.04,或者新装的 24.04/25.04 系统,sudo apt update 一跑就刷出一堆警告:
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).或者更严重的签名失败(NO_PUBKEY)。很多人还在用老方法 apt-key add 或 apt-key adv --recv-keys,结果不但警告不断,安全风险也越来越大。
今天我们来彻底搞懂:apt-key 到底是什么?为什么被弃用?signed-by 又是什么?怎么正确迁移?
1. apt-key:老大哥,为什么被“嫌弃”了?
apt-key 是 Debian/Ubuntu 早期用来管理 APT 签名密钥(GPG 公钥)的命令行工具。
经典用法(你可能每天都在敲):
bashwget -qO- https://example.com/key.asc | sudo apt-key add -或
bashsudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ABCDEF1234567890它把密钥放哪里?
- 主文件:
/etc/apt/trusted.gpg(全局大杂烩) - 或分文件:
/etc/apt/trusted.gpg.d/*.gpg(稍好点,但仍是全局)
- 主文件:
核心问题:全局无条件信任! 一旦你加了一个第三方源的密钥(比如 Docker、Node.js、Google Chrome),这个密钥就对整个系统所有源生效。 → 如果那个第三方源的私钥泄露,黑客就能伪造签名,替换官方 Ubuntu 源的包(比如 bash、openssh-server),给你装后门。 这就是著名的安全漏洞根源(参考 CVE-2011-3374 等历史问题)。
2026 年现状:
- 从 Ubuntu 20.10 / Debian 11 开始:强烈 deprecated,man apt-key 写明 “Deprecated APT key management utility”。
- Ubuntu 22.04 / Debian 12:apt-key 命令还在,但除
apt-key del外其他功能都警告。 - Ubuntu 24.04+ / Debian 13+:apt-key 基本被边缘化,很多发行版已移除
apt-key add等子命令,或在开发版中完全删除。 - 2026 年 2 月起,SHA-1 签名也被逐步封杀(Debian unstable 已不接受),apt-key 方式更不安全。
一句话:apt-key = 过时、全局信任、高风险,已被官方判死刑。
2. signed-by:现代救星,怎么玩?
signed-by 不是命令,而是一个sources.list 配置选项(man sources.list(5) 有详细说明)。
核心理念:每个源单独指定信任的密钥文件,不再全局信任。
推荐存储路径(2026 年最佳实践):
- 管理员手动管理的密钥 →
/etc/apt/keyrings/(最常用,apt 2.4+ 官方推荐) - 软件包自动安装的密钥 →
/usr/share/keyrings/(比如 ubuntu-keyring 包放的官方密钥)
- 管理员手动管理的密钥 →
标准步骤(以添加第三方源为例):
创建目录:
bashsudo mkdir -p -m 0755 /etc/apt/keyrings下载/导入密钥,转成二进制 .gpg 格式(dearmor):
bashcurl -fsSL https://example.com/key.asc | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg或从 keyserver:
bashsudo gpg --keyserver keyserver.ubuntu.com --recv-keys ABCDEF1234567890 sudo gpg --export ABCDEF1234567890 | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg在 sources.list 或 sources.list.d/xxx.list 里写:
bashdeb [signed-by=/etc/apt/keyrings/example.gpg] https://example.com/repo stable main # 如果有 deb-src,也加同样的 signed-by
2026 年额外福利:
- 支持 deb822 格式(/etc/apt/sources.list.d/xxx.sources 文件,更现代、可读性高):
Types: deb URIs: https://example.com/repo Suites: stable Components: main Signed-By: /etc/apt/keyrings/example.gpg
- 支持 deb822 格式(/etc/apt/sources.list.d/xxx.sources 文件,更现代、可读性高):
signed-by 的最大优势:密钥泄露也只影响这一个源,无法冒充官方源。安全隔离!
apt-key vs signed-by 对比(2026 版)
| 项目 | apt-key(旧) | signed-by(新) |
|---|---|---|
| 信任范围 | 全局(所有源都信任) | 仅限指定源 |
| 安全级别 | 低(易被跨源攻击) | 高(隔离信任) |
| 存储位置 | /etc/apt/trusted.gpg 或 trusted.gpg.d/ | /etc/apt/keyrings/ 或 /usr/share/keyrings/ |
| 官方状态 | Deprecated(22.04+ 警告,24.04+ 边缘化) | 强烈推荐,未来唯一方式 |
| 常见警告 | "apt-key is deprecated" / legacy keyring | 无(正确配置后干净) |
| 支持版本 | 老系统还能凑合用 | Ubuntu 18.04+ 全支持,24.04+ 首选 |
迁移建议
先检查现有密钥:
bashsudo apt-key list | grep -i ubuntu # 或其他源 ls /etc/apt/keyrings/ /usr/share/keyrings/迁移 Ubuntu 官方源(如阿里云镜像 bionic/noble):
- 导出官方密钥到独立文件(参考之前对话的 3B4FE6ACC0B21F32)。
- 加 [signed-by=...] 到 sources.list。
第三方源一律迁移(Docker、VSCode、NodeSource 等):
- 找官方文档的新安装脚本(大多已改 signed-by)。
- 手动改旧的 .list 文件。
清理旧密钥(可选,但推荐):
bashsudo apt-key del ABCDEF1234567890测试:
bashsudo apt update # 应该全 Hit:,无警告、无 Err