Skip to content

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 addapt-key adv --recv-keys,结果不但警告不断,安全风险也越来越大。

今天我们来彻底搞懂:apt-key 到底是什么?为什么被弃用?signed-by 又是什么?怎么正确迁移?

1. apt-key:老大哥,为什么被“嫌弃”了?

apt-key 是 Debian/Ubuntu 早期用来管理 APT 签名密钥(GPG 公钥)的命令行工具。

  • 经典用法(你可能每天都在敲):

    bash
    wget -qO- https://example.com/key.asc | sudo apt-key add -

    bash
    sudo 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 包放的官方密钥)
  • 标准步骤(以添加第三方源为例):

    1. 创建目录:

      bash
      sudo mkdir -p -m 0755 /etc/apt/keyrings
    2. 下载/导入密钥,转成二进制 .gpg 格式(dearmor):

      bash
      curl -fsSL https://example.com/key.asc | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg

      或从 keyserver:

      bash
      sudo gpg --keyserver keyserver.ubuntu.com --recv-keys ABCDEF1234567890
      sudo gpg --export ABCDEF1234567890 | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg
    3. 在 sources.list 或 sources.list.d/xxx.list 里写:

      bash
      deb [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

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+ 首选

迁移建议

  1. 先检查现有密钥

    bash
    sudo apt-key list | grep -i ubuntu   # 或其他源
    ls /etc/apt/keyrings/ /usr/share/keyrings/
  2. 迁移 Ubuntu 官方源(如阿里云镜像 bionic/noble):

    • 导出官方密钥到独立文件(参考之前对话的 3B4FE6ACC0B21F32)。
    • 加 [signed-by=...] 到 sources.list。
  3. 第三方源一律迁移(Docker、VSCode、NodeSource 等):

    • 找官方文档的新安装脚本(大多已改 signed-by)。
    • 手动改旧的 .list 文件。
  4. 清理旧密钥(可选,但推荐):

    bash
    sudo apt-key del ABCDEF1234567890
  5. 测试

    bash
    sudo apt update   # 应该全 Hit:,无警告、无 Err