密钥存储在传统的trusted.gpg密钥环中(/etc/apt/trusted.gpg)。

我刚刚从Ubuntu 21.10升级到22.04。 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.

Synaptic在重新加载时显示相同的警告。

查看man apt-key对我来说并没有澄清这个问题。

认为这是因为Ubuntu 22.04已经从使用/etc/apt/trusted.gpg转变为使用位于/etc/apt/trusted.gpg.d目录中的单独的.gpg文件。

这些密钥可以从一种格式转换为另一种格式,还是必须删除这些密钥并重新导入它们?


1https://askubuntu.com/a/1403964/1210606 - ChanganAuto
1@长安汽车 感谢您提供的线索!这是一大堆信息需要消化。不知道为什么升级没有解决这个问题... 这将给很多用户带来麻烦。 - heynnema
4这个回答解决了你的问题吗?更新系统时出现apt-key弃用警告 - starbeamrainbowlabs
@starbeamrainbowlabs 谢谢你的线索!请看下面我简化的答案。 - heynnema
@长安汽车 请查看我下面的简化答案。 - heynnema
干得好。+1(应该多一点) - ChanganAuto
更新:我找到了一个简单而正确的实际解决方案。请查看下面的回答。 - anon
6个回答

解决由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

您可以选择运行以下命令从/etc/apt/trusted.gpg中删除已废弃的密钥:

sudo apt-key --keyring /etc/apt/trusted.gpg del 91E7EE5E

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

4那就是我一直在寻找的答案。谢谢! - YourHelper
太棒了。这对我有效。有没有什么理由从传统系统中删除该密钥? - lindhe
@lindhe 那是可选的。我在我的系统上没有。没问题。 - heynnema
1我尝试了不同的方法来实现这个,而这是最简单的方式。我收到了一个警告(警告:apt-key已被弃用,请改为在trusted.gpg.d中管理密钥环文件(参见apt-key(8))),但是.gpg文件已经创建成功。 - apaderno
你能使用apt-key list命令生成一个gpg文件,而不需要知道apt错误吗?你上面的例子使用了team-xbmc,但是key list中没有存储这个名称。有没有办法在不知道apt错误的情况下做到这一点?我想在警告出现之前消除它。 - DontAsk
@JimTippins 是的,你可以这样做...不过... "apt-key list" 可能会生成比你实际需要关注的更长的列表。观察从 "sudo apt update" 中出现的任何警告错误将节省你很多时间。 - heynnema
为什么这么手动呢?让我们完全自动化吧! (另外,为什么这个不能自动处理呢?比如说apt-key的插件,或者其他什么的...) 编辑:@JDMcMillian在下面自动化了。耶! - anon
1@Evi1M4chine 除了自动化方式有一个问题(即使用来自未知作者的大约50个字符的bash脚本),它还会导出trusted.gpg中的所有条目,而其中许多是不需要的。我的方法只会导出所需的条目。 - heynnema
@heynnema:虽然你的方法根本没有导出任何东西。^^ 用户必须自己去做。这有点违背使用计算机的初衷。^^ … 我同意只导出所需的内容。但是,首先就不应该有其他内容存在,对吧?如果有的话,脚本应该添加一个过滤器。… 而且,你也不知道在你的系统上执行的其余代码是谁写的。显然,在执行之前,人们期望阅读和理解脚本。这就是为什么我编辑了答案,使其易读。 :) - anon
2@heynnema:顺便说一下,我寻找脚本的确切原因是因为你的方法让查找实际所需的脚本变得非常麻烦。所以虽然你的意图无疑是好的,但最终还是不得不写一个循环来处理所有脚本。^^ - anon
@Evi1M4chine 关于“因为你的方式使得查找实际需要的条目非常麻烦”...只需执行 sudo apt update 即可看到哪些条目需要转换。 - heynnema
@heynnema:不是的,因为你的方法要求手动找出哪个密钥与哪个警告相关,并且没有说明如何做到这一点。当警告通常甚至不包含在apt-key list中可以找到的任何字符串时...你的例子非常幸运,因为URL中的XBMC以小写形式出现,在密钥描述中以大写形式出现。这不能推广,因为人们无法知道URL的哪个部分可能与密钥描述的哪个部分匹配,也不一定有任何匹配。 - anon
1如果您收到“警告:apt-key已被弃用。请在trusted.gpg.d中管理密钥环文件(参见apt-key(8))。gpg:警告:未导出任何内容gpg:未找到有效的OpenPGP数据。”错误,是因为哈希值需要写入一个单独的块。 - David Beauchemin
@heynnema 谢谢你的回答!你会如何处理 W: http://archive.ubuntu.com/ubuntu/dists/jammy/InRelease Key is stored in legacy ... 这个问题? - undefined
@Filbuntu 首先尝试这个简单的修复方法...打开软件和更新应用程序,选择Ubuntu软件选项卡,注意当前选择的下载服务器,选择其他国家的服务器,然后执行sudo apt update命令,接着将服务器改回你所在国家的服务器,并再次执行sudo apt update命令。看看这是否解决了问题。 - undefined
@Filbuntu 我没有告诉你取消所有的源。那样做会破坏修复的尝试。请检查所有的源,将下载服务器更改为其他国家,然后执行sudo apt update命令,再将下载服务器更改为你所在的国家,再次执行sudo apt update命令。 - undefined
@heynnema 哇,你真快。抱歉我简化了我所做的事情。我按照你写的几次进行操作,但没有取消所有的来源。我尝试了世界各地的不同服务器,然后又切换回我的国家。但是,这几天前这个方法没有起作用,所以我尝试了取消来源(和更换服务器)并重新启动,但问题仍未解决。今天我再次尝试了你的建议,但仍然没有解决问题。真可惜,因为这本来是一个简单又容易解决的问题。 - undefined
@Filbuntu然后试试这个。打开“软件和更新”,选择“认证”选项卡。看看是否有“Ubuntu存档”的条目。在我的系统上,它显示的密钥以C0B21F32结尾(你的可能不同)。根据说明使用最后8个数字创建一个新的gpg密钥。然后运行“sudo apt update”,看看错误是否消失。 - undefined
@Filbuntu 给我看一下 ls -al /etc/apt/trusted.gpg.d/ubuntu-keyring*,以及 sudo apt-key list | grep -i "Ubuntu Archive" -B5。将每个命令的输出放在单独的注释中。 - undefined
1让我们在聊天中继续这个讨论。 - undefined

在迁移到Ubuntu 22.04后遇到了这个问题,并想要添加我的解决方案。我有很多需要更新/转换的密钥。这不是最佳解决方案,但效果很好。
这个解决方案仅适用于Ubuntu 22.04,使用bash 5.2.16。其他发行版和版本可能无法正常工作。
一个一行命令将所有这些已弃用的密钥转换为新格式。
在运行之前,请花时间理解你在做什么!还要确保你的bash版本不太旧。我的bash版本:GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
for KEY in $(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" ); do K=${KEY:(-8)}; apt-key export $K | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/imported-from-trusted-gpg-$K.gpg; done

对于那些想要更易读的人...

for KEY in $( \
    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" \
); do
    K=${KEY:(-8)}
    apt-key export $K \
    | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/imported-from-trusted-gpg-$K.gpg
done

解释:
  1. 获取已知密钥列表:

    apt-key list
    
  2. 查找所有具有1或2个空格前缀的16进制字符组合,且长度为4个字符。获取每行中有10个这样的组合的集合。这提供了完整的密钥签名。

    grep -E "(([ ]{1,2}(([0-9A-F]{4}))){10})"
    
  3. 删除每行中的所有空格,使密钥签名不受空白字符的干扰:

    tr -d " "
    
  4. 获取每行的最后8个字符:

    grep -E "([0-9A-F]){8}\b"
    

    现在我们有了一个包含每个8个字符长的密钥后缀的集合。

  5. 循环遍历每个密钥后缀,将当前后缀放入变量 KEY 中:

    for KEY in $(…); do
    
  6. 将最后8个字符赋值给变量 K

    K=${KEY:(-8)};
    
  7. 导出与 K 中的签名匹配的密钥,并将其传递/管道到 gpg 中以正确存储:

    apt-key export $K | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/imported-from-trusted-gpg-$K.gpg
    
  8. 循环直到处理完所有密钥。

    done
    
  9. 享受没有更多弃用警告的快乐。

特别感谢heynnema,他的solution是这个项目的核心。

6不确定为什么这个没有更多的赞……它像魔法一样有效。 - dentex
这就是如何做到的! - anon
1请注意,“不理想”的部分可能指的是将这些密钥“污染”到关键的新目录中,即使这些密钥被替换(导致重复)或者甚至被撤销(例如因为被入侵)。所以一旦每个ppa都赶上了,就需要再次清理!rm -f /etc/apt/trusted.gpg.d/imported-from-trusted-gpg-*.gpg - anon
太棒了!谢谢! - TheodorosPloumis
在Mint 21上对我不起作用。我的更新管理器错误消息是W: https://linux.teamviewer.com/deb/dists/stable/InRelease:密钥存储在legacy...**,按照上面给出的方法将bash脚本复制为**upd.sh并运行后,我收到了警告消息警告:apt-key已弃用,请改用trusted.gpg.d中的密钥环文件(参见apt-key(8)),然后是**./upd.sh:7:Bad substitution**。 - FumbleFingers
上面列出的命令不是一个shell脚本,而是在命令行中的单个命令。每行末尾的''字符是由karel添加的,以便更容易阅读,但您可以将整个代码复制/粘贴到命令行提示符中。话虽如此,在编写这个命令时,我需要转换超过20个键。如果您只需要转换1或2个键,我建议您遵循heynnema原始(已接受)的解决方案以更好地理解。无论是脚本还是大型(尽管是单行)命令,都不能取代您对任何基于Linux的系统的理解。 - JDMcMillian
@JDMcMillian,感谢您在这里提供的详细步骤解释。 - JJGabe
1我确认在Linux Mint 21上也可以正常运行(bash版本为5.1.16(1))。谢谢,干得好。 - Martin Osusky

对我有效的方法是:
mv /etc/apt/trusted.gpg /etc/apt/trusted.gpg.d/

1这对我也起作用了。而且,我对所选答案感到困惑,因为它太复杂了,但是采用这个方法很简单。我使用的是Linux Mint(Vanessa)系统。 - Barra
这没有解决Mint Vanessa的问题,我不得不去源列表中删除有问题的部分。 - Alkanshel
这对我在Mint21上起作用。我费了很大劲按照排名靠前的答案中复杂的指示进行操作,但最终被某种“语法错误”所困扰(可能与teamviewer密钥的结构/存储方式有关)。为了保险起见,在运行这里提供的单行解决方案之前,我使用fsarchiver进行了完整的系统备份。但重新启动后一切看起来都很正常,谢谢。 - FumbleFingers
在Mint 21上工作过 :-) - c05772
2不如尝试软链接而不是移动它,以增加兼容性。 - anon
我认为@Evi1M4chine的想法是正确的,为了防止将来出现问题,创建一个软链接是个好主意。这在Linux Mint Vanessa上非常有效。作为参考,问题发生在我配偶在进行更新时他的wifi掉线了。我首先尝试了heynnema提出的“导出”解决方案,但它给了我一个apt-key已被弃用的警告,并且似乎没有产生任何影响。所以我继续往下滚动看到了这些建议。谢谢。 - Criminally Inane
这对我在Ubuntu 22.04.3上也有效。但是需要添加sudo权限。 - undefined

我修改了@Frank的函数,从遗留的trusted.gpg中移除了密钥,以避免重复。
function apt-key-migrate {
    typeset key="$1"
    typeset dest="$2"

    if [ -z "$key" ] || [ -z "$dest" ];
    then
        echo "Usage: apt-key-migrate <key> <destination>"
        return 1
    fi

    sudo apt-key --keyring /etc/apt/trusted.gpg export $key | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/$dest.gpg
    sudo apt-key --keyring /etc/apt/trusted.gpg del $key
}

我已经将@heynnema的答案转化为一个函数,你可以方便地将其放在.bashrc下。这个函数接受两个参数:密钥(最后8个字符)和输出GPG文件的目标文件名。
function apt-key-migrate {
  typeset key="$1"
  typeset dest="$2"

  if [ -z "$key" ] || [ -z "$dest" ];
  then
    echo "Usage: apt-key-migrate <key> <destination>"
    return 1
  fi

  sudo apt-key export $key | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/$dest.gpg
}

示例:apt-key-migrate 91E7EE5E team-xbmc

apt-key已被弃用,并将在Ubuntu 22.04上逐步替换。

当您需要时,可以使用以下命令删除现有密钥:

apt-key list

并且

apt-key del YOUR-KEY

使用类似以下命令导入您的密钥:
curl https://yourrepo.com/repo.key | gpg --dearmor | sudo dd of=/usr/local/share/keyrings/your-repo.gpg

将签名添加到/etc/apt/sources.list.d/your.list文件中。
deb [signed-by=/usr/local/share/keyrings/your-repo.gpg]  https://yourepo./ubuntu jammy main

更多关于手册的详细信息:
链接 这里也有很好的详细信息: 链接

1我的答案简单得多。它不需要任何删除、卷曲或任何.list文件的编辑。 - heynnema