在Ubuntu 18.04上,Apt拒绝`/etc/apt/trusted.gpg.d`中的密钥环。

7
我在Ubuntu 18.04(Bionic Beaver)上遇到了一个问题,与apt及其处理验证软件库的可信密钥的方式有关。
在Ubuntu 14.04中,我们通常将用于签署我们软件发布的存储库的密钥安装为keyring到 /etc/apt/trusted.gpg.d。这样apt就知道该密钥是可信的。
然而,在Ubuntu 18.04上似乎不再起作用了。如果我做同样的操作,更新时会出错:
# apt-get update
Hit:1 http://company.com/ubuntu-snapshot bionic InRelease                     
Reading package lists... Done                                                     
W: http://company.com/ubuntu-snapshot/dists/bionic/InRelease: The key(s) in the keyring /etc/apt/trusted.gpg.d/company-keys.gpg are ignored as the file is not readable by user '_apt' executing apt-key.

明显的尝试通过
# sudo chown -v _apt /etc/apt/trusted.gpg.d/company-keys.gpg
changed ownership of '/etc/apt/trusted.gpg.d/company-keys.gpg' from root to _apt

不能工作,因为apt-get update会产生以下结果:

# apt-get update
Hit:1 http://company.com/ubuntu-snapshot bionic     InRelease                    
Reading package lists... Done                                                     
W: http://company.com/ubuntu-snapshot/dists/bionic/InRelease: The key(s) in the keyring /etc/apt/trusted.gpg.d/company-keys.gpg are ignored as the file has an unsupported filetype.

如果我使用以下行添加密钥本身是有效的,那么一切都能按预期工作:

 wget -O - http://company.com/key.gpg | sudo apt-key add -

不幸的是,我们无法选择后者,因为我们想部署自己的密钥,并且拥有更改/撤销它们的能力。

我无法弄清楚为什么apt拒绝/etc/apt/trusted.gpg.d中的密钥环,也找不到描述apt对新Ubuntu版本的不同期望的变更日志。如果您能指出一些资源来解决此问题,我将非常感激。

3个回答

6
您可以使用gpg的--dearmor选项将ASCII装甲密钥转换为二进制格式,这是apt所期望的格式,而在trusted.gpg.d中的那些密钥会被apt拒绝。
gpg --dearmor keyfile

6

看起来你的密钥文件(/etc/apt/trusted.gpg.d/company-keys.gpg)是一种不支持的格式。 apt-key 的手册页面解释了哪些格式是支持的:

apt-key 只支持二进制 OpenPGP 格式(也称为“GPG 公钥环”),在扩展名为“gpg”的文件中使用,而不是引入新版本 gpg(1) 中默认用于密钥环文件的 keybox 数据库格式。 为了与任何 apt 版本一起使用的二进制密钥环文件应始终使用 gpg --export 创建。

或者,如果所有应该使用创建的密钥环的系统都安装了至少 apt 版本>= 1.4,则可以改用 ASCII 装甲格式,其扩展名为“asc”,可以使用 gpg --armor --export 创建。

要检查文件格式,请运行 file /etc/apt/trusted.gpg.d/company-keys.gpg。 如果它说“GPG 公钥环”,那么我会认为它可以正常工作,我无法解释您所看到的问题。

如果它说“GPG keybox database”,那么问题就是文件格式。 您可以使用以下命令将其转换(感谢 @Wildcard 在his answer中包含此命令):

gpg --no-default-keyring --keyring /etc/apt/trusted.gpg.d/company-keys.gpg --export > /etc/apt/trusted.gpg.d/company-keys.fixed.gpg

如果您反复遇到此问题,则可能需要检查您如何将密钥安装到/etc/apt/trusted.gpg.d/。我曾经遇到一个问题,尝试运行gpg --keyring /etc/apt/trusted.gpg.d/mine.gpg列出密钥环的内容时,会导致该文件被创建为不支持的keybox文件。随后,将密钥添加到该密钥环中并不能使其可用。
此外值得注意的是,似乎没有理由使用apt-key add。根据手册:
“应当直接将密钥环放置在/etc/apt/trusted.gpg.d/目录下,并使用描述性名称和"gpg"或"asc"作为文件扩展名。”
因此,如果您正在使用apt-key add,则可以考虑直接复制该文件。

如果你收到警告 "gpg: WARNING: nothing exported",可能是因为你正在使用相对路径。尝试在文件名前加上 **./**。 - a1ezh

4

简而言之: Mark's answer 是正确的。您可以使用以下方法将 keybox 转换为 keyring:

gpg --no-default-keyring --keyring ./the-keybox-file.gpg --export > /etc/apt/trusted.gpg.d/this-keyring-will-actually-work.gpg

我遇到了相同的情况,试图按照修改后的 Fluentd 安装说明操作,以便不必在任何服务器上运行 apt-key。我找到了解决办法,以下是我的笔记:

我正在阅读的说明:https://docs.fluentd.org/installation/install-by-deb

他们要求您运行的脚本包括以下命令:

curl https://packages.treasuredata.com/GPG-KEY-td-agent | apt-key add -

但我想将这个密钥转换为密钥环,这样我就可以将它放在一个目录中而不是在每台服务器上运行命令。

我使用了我以前写的一些类似的笔记:

那时我遇到了你在这里所说明的问题。

这是我使用的完整解决方案:

# head -n 2 /etc/os-release
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
# ls
GPG-KEY-td-agent
# file GPG-KEY-td-agent
GPG-KEY-td-agent: PGP public key block Public-Key (old)
# gpg --no-default-keyring --keyring ./tempfile.gpg --import ./GPG-KEY-td-agent
gpg: keybox './tempfile.gpg' created
gpg: key 901F9177AB97ACBE: public key "Treasure Data, Inc (Treasure Agent Official Signing key) <support@treasure-data.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1
# gpg --no-default-keyring --keyring ./tempfile.gpg --export > td-agent-keyring.gpg
# file *
GPG-KEY-td-agent:     PGP public key block Public-Key (old)
td-agent-keyring.gpg: GPG key public ring, created Tue Dec 27 08:18:20 2016
tempfile.gpg:         GPG keybox database version 1, created-at Sat Jul 20 02:36:45 2019, last-maintained Sat Jul 20 02:36:45 2019
tempfile.gpg~:        GPG keybox database version 1, created-at Sat Jul 20 02:36:45 2019, last-maintained Sat Jul 20 02:36:45 2019
# mv td-agent-keyring.gpg /etc/apt/trusted.gpg.d/
# 

感谢您发布了转换文件格式的命令。我已将其包含在我的答案中。 - Mark Doliner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接