更新系统时出现apt-key弃用警告

最近我注意到在运行apt时出现了一些问题,系统会警告我密钥环已经过时。
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
8 packages can be upgraded. Run 'apt list --upgradable' to see them.
W: https://packages.microsoft.com/repos/edge/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
W: https://download.sublimetext.com/apt/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.

这并不妨碍我进行更新,但在更新系统时,我宁愿不见到这个。未来我们应该如何存储可信的 GPG 密钥?

https://wiki.debian.org/DebianRepository/UseThirdParty - OrangeDog
1这个回答解决了你的问题吗?哪些命令(确切地)应该替代已弃用的apt-key? - OrangeDog
在Ubuntu更改其GPG工具并导致每个人都必须处理这个问题的挫败感之后,输入愚蠢的命令来修复,对我甚至无法删除密钥:sudo apt-key del <last 8 chars from sudo apt-key list | grep -i -C 5 <pgk> >,似乎删除包和源文件grep <pkg> /etc/apt/sources.list.d/*并重新安装起作用了。apt purge <pkg>可能会删除源文件,但也可能同时删除配置文件。 - alchemy
7个回答

一种解决方法是从已弃用的密钥环导出GPG密钥,并将其存储在/usr/share/keyrings中。幸运的是,这并不太困难:
  1. 打开终端(如果还没打开的话)

  2. 列出现有的密钥:

    $ sudo apt-key list
    警告:apt-key已弃用。请改在trusted.gpg.d中管理密钥环文件(参见apt-key(8))。
    /etc/apt/trusted.gpg
    --------------------
    pub   rsa4096 2017-05-08 [SCEA]
          1EDD E2CD FC02 5D17 F6DA  9EC0 ADAE 6AD2 8A8F 901A
    uid           [ unknown] Sublime HQ Pty Ltd <support@sublimetext.com>
    sub   rsa4096 2017-05-08 [S]
    
    pub   rsa2048 2015-10-28 [SC]
          BC52 8686 B50D 79E3 39D3  721C EB3E 94AD BE12 29CF
    uid           [ unknown] Microsoft (Release signing) <gpgsecurity@microsoft.com>
    
  3. 从这里,我们可以导出一个密钥:

    sudo apt-key export BE1229CF | sudo gpg --dearmour -o /usr/share/keyrings/microsoft.gpg
    

    注意:BE1229CF值来自于pub代码的最后8个字符。

    以下信息可能会显示:

    警告:apt-key已弃用。请改在trusted.gpg.d中管理密钥环文件(参见apt-key(8))。
    
  4. 现在我们可以更新仓库的apt源文件(例如,/etc/apt/sources.list.d/microsoft.list),添加一个signed-by标签:

    deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/edge/ stable main
    
  5. 更新apt以确认消息是否消失:

    sudo apt update
    ...
    正在读取软件包列表... 完成
    正在构建依赖树... 完成
    正在读取状态信息... 完成
    所有软件包均已是最新版。
    W: https://download.sublimetext.com/apt/stable/InRelease: 密钥存储在传统的trusted.gpg密钥环中(/etc/apt/trusted.gpg),请参阅apt-key(8)中的DEPRECATION部分了解详情。
    
  6. 删除原始签名:

    sudo apt-key del BE1229CF
    
这可以用每个警告信息来完成。一旦完成,apt 将不再抱怨。

1@ArturMeinild 这个消息很好知道。 - matigo
7你应该使用/usr/share/keyrings,而不是/etc/apt/keyrings - https://wiki.debian.org/DebianRepository/UseThirdParty - OrangeDog
6关于:“注意:BE1229CF值来自发布代码的最后8个字符。” — 你能再详细解释一下吗?"BE1229CF"在屏幕上显然没有出现。你是否进行了某些位操作来获取这个值? - Martin Mucha
1@MartinMucha看一下第1项中的代码块。你会在倒数第二行看到 BE12 29CF。那就是它来自的地方。 - matigo
@matigo该死的,不知道我怎么会忽略它。谢谢。我把整行文字复制粘贴到引号中也可以,但这样更好。 - Martin Mucha
@matigo 在这里可以看到我的简化回答:链接 - heynnema
1有没有可能将*.gpg文件存储在apt可以自动找到的位置?我觉得在仓库定义中使用signed-by属性真的很丑陋,尤其是绝对路径的情况下。 - mefiX
你是在为特定的键创建列表名称吗?例如,BE1229CF将与Microsoft列表对齐,对吗? - DontAsk
@holocronweaver 有没有办法我可以使用脚本自动化这个过程?我需要迁移17个密钥,虽然对于少数密钥来说这是一个很好的解决方案,但是逐个处理所有的17个将会花费太长时间,Zanna(下面)提供的解决方案最多只是短期内的临时措施,而在最坏的情况下可能会带来安全风险。 - EvilSupahFly
2如果一个应用程序自动配置了.list文件,那么每次都会还原更改,该怎么办呢?例如,在slack.list文件中找到以下警告:`### 此文件是自动配置的 ###

您可以注释掉此条目,但任何其他修改可能会丢失。`

如何解决这种特殊情况,即确保signed-by的添加被保留,不被apt源维护者还原?
- dimisjim
你如何知道给钥匙扣命名为什么?就像在你发布的示例中,你使用/usr/share/keyrings/microsoft.gpg,所以你将文件命名为microsoft.gpg。所以我有一个类似于pub rsa2048 2016-02-17 [SC] 9FE3 B226 BD77 5196 D8C2 E599 DE88 104A A4C6 383F uid [unknown] DigitalOcean Insights Engineering <sonar:agent@digitalocean.com> sub rsa2048 2016-02-17 [E]这样的密钥。我怎么知道该如何命名文件,或者是否重要呢? - Steve K
不太困难吧? https://askubuntu.com/a/1408456/129227 不太困难... - Wolfgang Fahl
@SteveK 可能并不重要,但你可以始终保持它们与 /usr/share/keyrings/ 下的其他密钥命名方式一致,并将其与 /etc/apt/sources.list.d/*.list 下的文件名进行比较。在我的情况下,它们非常一致,逻辑也非常明显易懂! - Gwyneth Llewelyn
我不明白你是怎么得到这个https://packages.microsoft.com/repos/edge/ stable main 的。我在尝试时也遇到了一个错误:zsh: bad pattern: [arch=amd64 - James
在我的情况下,我需要将文件导出到/etc/apt/trusted.gpg.d文件夹。 - Melroy van den Berg
我尝试了一下针对Sublime Text错误的方法(与示例类似,只是文件名可能不同),发现原始的sublime-text.list条目已被注释掉 - "#disabled on upgrade to jammy"。其他一些应用程序的.list文件也是如此,例如vscode.list、vivaldi.list等。 - Trunk
有没有可以使用Ansible自动化步骤的可用手册? - Ouss
这个手动工作太多了。下面列出的解决方案是一个更好的方法:https://askubuntu.com/a/1408456/652884 - Marc Compere
不要忘记在钥匙链中的新密钥上执行 sudo chmod 644。 - jmary
1你不需要解除其装甲或添加signed-by=;相反,只需执行sudo apt-key export {keyid} | sudo tee /etc/apt/trusted.gpg.d/{newname}.asc并再次运行sudo apt update。它不仅会在没有任何sources.list编辑的情况下找到它,而且密钥将以易于管理的装甲格式存在。 - isaaclw
apt-key已被弃用 - undefined
@James,你需要编辑与你的软件包对应的文件,该文件位于/etc/apt/sources.list.d目录下,以本例来说,文件路径是/etc/apt/sources.list.d/microsoft.list。只需执行sudo vim /etc/apt/sources.list.d/microsoft.list命令,你会看到已经存在deb [arch=amd64] https://packages.microsoft.com/repos/edge/ stable main这一行,然后你只需在[arch=amd64]的内部添加signed-by=/usr/share/keyrings/microsoft.gpg即可。 - undefined

尝试一下
cd /etc/apt
sudo cp trusted.gpg trusted.gpg.d

$ cd /etc/apt $ sudo cp trusted.gpg trusted.gpg.d 以上方法对我有效。 - Mark C
18对于审阅者:这是有道理的,因为/etc/apt/trusted.gpg是一个单一密钥环的旧形式。在现代的apt中,每个密钥环都单独存储在/etc/apt/trusted.gpg.d中。将遗留数据库移动到/etc/apt/trusted.gpg.d/是解决手动重新添加存储库并使apt自动更新密钥存储的方法之一。这是一个解决办法,虽然不是最好的也不是APT首选的解决方案,但它仍然是一个解决方案。 - Thomas Ward
2两位首次发帖的用户留言(作为回答),表示这对他们起效果。此贴不应被删除。我代表这两位新用户点赞这个回答。 - user68186
12某事物有效并不意味着它是一个好的或可行的解决方案。这取决于存储在“trusted.gpg”内部的密钥,这可能潜在地构成安全漏洞。 - Artur Meinild
4Ubuntu 22.04。对我也有效。谢谢。 - sundowatch
1文件夹 trusted.gpg.d 应该每个文件只有一个密钥,是吗?apt 不会以任何方式操作复制的文件。apt-key list 仍然打印出警告,即使我移动了文件并且它被识别。此外,cp 命令会创建两个相同文件的副本。 - Валерий Заподовников
1在 Pop_OS 22.04 上工作过。 - Andor Kiss
在 elementary OS 上对我也起作用了 - tomriddle99
1我选择了一个符号链接,以防将来在trusted.gpg中添加更多的密钥:sudo ln -s ../trusted.gpg /etc/apt/trusted.gpg.d/ - Jayen
在Ubuntu 22.04上对我来说完美运行。我收到了以下警告。W: https://download.owncloud.com/desktop/ownCloud/stable/latest/linux/Ubuntu_22.04/InRelease: 密钥存储在传统的trusted.gpg密钥环中(/etc/apt/trusted.gpg),请参阅apt-key(8)中的DEPRECATION部分获取详细信息。 W: http://packages.osrfoundation.org/gazebo/ubuntu-stable/dists/jammy/InRelease: 密钥存储在传统的trusted.gpg密钥环中(/etc/apt/trusted.gpg),请参阅apt-key(8)中的DEPRECATION部分获取详细信息。 - Max

解决由sudo apt update生成的这些警告信息的简单方法...
W: https://linux.teamviewer.com/deb/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
W: http://apt.keepsolid.com/ubuntu/dists/groovy/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
W: http://linux.dropbox.com/ubuntu/dists/disco/Release.gpg: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
W: http://download.virtualbox.org/virtualbox/debian/dists/hirsute/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
W: http://download.opensuse.org/repositories/home:/IBBoard:/cawbird/xUbuntu_22.04/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
W: http://ppa.launchpad.net/solaar-unifying/stable/ubuntu/dists/jammy/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
W: http://ppa.launchpad.net/team-xbmc/ppa/ubuntu/dists/jammy/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
W: http://ppa.launchpad.net/yannubuntu/boot-repair/ubuntu/dists/jammy/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.

注意:这些警告信息可以由“软件和更新”中的“其他软件”选项卡中的任何启用的仓库或ppa生成。
示例修复:

关于此警告消息与sudo apt update...

W: http://ppa.launchpad.net/team-xbmc/ppa/ubuntu/dists/jammy/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.

我们查看sudo apt-key list,在其中找到了xbmc的条目...
pub   rsa1024 2009-01-20 [SC]
      1897 01DA 570C 56B9 488E  F60A 6D97 5C47 91E7 EE5E
uid           [ unknown] Launchpad PPA for XBMC for Linux

然后我们将这个条目转换为一个.gpg文件,使用上面的最后8个数字字符...
sudo apt-key export 91E7EE5E | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/team-xbmc.gpg

对于由sudo apt update生成的每个警告消息,重复上述命令。
注意:部分内容摘自这里这里的答案。

1我更喜欢这个答案,因为它将密钥放在/etc/apt/trusted.gpg.d/目录下。 - Tod Thomson
1对我来说加1分;前两个答案在我的Linux Mint Vanessa系统上失败了,显示zsh: bad pattern: [arch=amd64 - AlMo320
谢谢你的反馈。这让我想知道为什么没有官方工具来做这件事。他们似乎试图解决一个安全漏洞,但在实际的现有安装中并未提供简便的实施方法,这真是糟糕透了。 - TheMechanic
如何生成神奇的"91E7EE5E"代码? - Peter Krauss
1@PeterKrauss 就像答案中所说的那样,执行sudo apt-key list命令,然后使用输出结果中的最后8个字符... "91E7 EE5E",不要有空格。 - heynnema

鉴于提供的所有好建议,我已经制作了一个辅助一行代码来自动化处理所有的键:
sudo apt-key list 2>&1 | grep -E '(trusted.gpg.d)' -A 3 | grep -v '^\-\-' | grep -v '^pub ' | sed 's@.*/trusted.gpg.d/\(.*\)@\1@g' | awk 'NR%2{printf "%s ",$0;next;}1' | awk '{print "sudo apt-key export "$10$11" | sudo gpg --dearmour -o /usr/share/keyrings/"$1}' | xargs -I{} eval("{}")

谢谢,但是给我一个错误:bash: syntax error near unexpected token (' 看起来有一些警告输出在这里,所以我可以通过删除最后的 | xargs 然后手动复制粘贴输出来使用它。 - Epskampie
3对我来说没问题,但是我需要稍微修改一下:sudo apt-key list 2>&1 | grep -E '\/(trusted.gpg.d)' -A 3 | grep -v '^\-\-' | grep -v '^pub ' | /bin/sed 's@.*/trusted.gpg.d/\(.*\)@\1@g' | /bin/awk 'NR%2{printf "%s ",$0;next;}1' | /bin/awk '{print "sudo apt-key export "$10$11" | sudo gpg --dearmour -o /usr/share/keyrings/"$1}' | xargs -I'{}' bash -c "eval '{}'"。在第一个grep中,你需要使用正则表达式'\/(trusted.gpg.d)',并匹配警告信息。最后,我需要更改xargs的执行方式。 - Bernardo Loureiro
1谢谢!我的密码是:sudo apt-key list | sudo awk -v n=4 'n==3{k=$(NF-1)$NF;cmd="apt-key export "k"|gpg --dearmour -o "d;print cmd;system(cmd)}/^\/.*\/trusted\.gpg\.d\//{d=$1;n=0}{n++}' - keithpjolley

如果你使用apt/trust.gpg.d/文件夹并且你在debian系统上,就不需要编辑sources.list。
按照其他步骤获取密钥ID。
$ apt-key list
/etc/apt/trusted.gpg
--------------------
pub   rsa2048 2012-04-01 [SC]                                                                                                                                  
      A0DA 38D0 D76E 8B5D 6388  7281 9165 938D 90FD DD2E        
uid           [ unknown] Mike Thompson (Raspberry Pi Debian armhf ARMv6+VFP) <mpthompson@gmail.com>                                                            
sub   rsa2048 2012-04-01 [E]

然后运行:
apt-key export 90FDDD2E | sudo tee /etc/apt/trusted.gpg.d/raspberry.debian.armhf.asc

你可以删除trust.gpg文件,但是不删除它错误就会消失。

我用一些类似下面的命令解决了它。
gpg --refresh-keys

这将更新所有的关键并解决问题。

对于在$(
apt-key --keyring /etc/apt/trusted.gpg list
| grep -E "(([ ]{1,2}(([0-9A-F]{4}))){10})"
| tr -d " "
| grep -E "([0-9A-F]){8}\b"
)中的每个KEY,执行以下操作: K=${KEY:(-8)} apt-key export $K
| sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/imported-from-trusted-gpg-$K.gpg 完成
- Muhammad Irfan Aslam
2这对我来说不起作用,Ubuntu 22.04.1 LTS,Jammy。 - M.K
1在Kali 2022.4版本中对我无效。 - J. Scott Elblein

在我的情况下,上述的解决方案都没有起作用。也许是因为这是一个特殊情况。警告:
9 packages can be upgraded. Run 'apt list --upgradable' to see them.
W: https://packages.cloud.google.com/apt/dists/coral-cloud-stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
W: https://packages.cloud.google.com/apt/dists/coral-edgetpu-stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.

这个方法对我有用:

wget -O- https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo tee /etc/apt/trusted.gpg.d/coral-edgetpu.gpg

那个是做什么用的?你能给一个更通用的解决方案吗?我在其他程序中也遇到了同样的问题。 - cipricus
我猜这是一种以更新的方式添加第三方库的方法。这两个参考资料可能会有所帮助!ref1ref2 @cipricus - M.K