Apt拒绝Ubuntu 18.04上“/etc/Apt/trusted.gpg.d”中的密钥环

Apt拒绝Ubuntu 18.04上“/etc/Apt/trusted.gpg.d”中的密钥环,ubuntu,gnupg,apt,ubuntu-18.04,Ubuntu,Gnupg,Apt,Ubuntu 18.04,我在Ubuntu18.04(仿生海狸)上遇到了一个关于apt的问题,以及它处理可信密钥以验证存储库的方式 在Ubuntu14.04上,我们曾经将用于在软件发行版存储库中签名的密钥作为keyring安装到/etc/apt/trusted.gpg.d。因此,apt知道密钥是可信的 然而,这似乎不再适用于Ubuntu 18.04。如果在此处执行相同操作,则在更新过程中会出现错误: # apt-get update Hit:1 http://company.com/ubuntu-snapshot bio

我在Ubuntu18.04(仿生海狸)上遇到了一个关于apt的问题,以及它处理可信密钥以验证存储库的方式

在Ubuntu14.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版本的不同期望。如果您能找到一些资源来解决这个问题,我将非常高兴。

听起来您的密钥文件(
/etc/apt/trusted.gpg.d/company keys.gpg
)是不受支持的格式。
apt键
手册页解释了支持的功能:

apt密钥仅支持二进制OpenPGP格式(也称为“GPG”) 密钥公用环),而不是密钥盒 在较新的gpg(1)版本中引入的数据库格式作为 钥匙圈文件。用于任何apt的二进制密钥环文件 因此,应该始终使用gpg--export创建版本

或者,如果所有应使用 keyring至少安装了apt版本>=1.4,您可以使用 ASCII铠装格式,扩展名为“asc”,可以 使用gpg--armor--export创建

要检查文件格式,请运行
file/etc/apt/trusted.gpg.d/company keys.gpg
如果它显示“gpg key public ring”,那么我希望它可以工作,我无法解释您看到的问题

如果它说“GPG密钥箱数据库”,那么问题是文件格式。您可以使用此命令对其进行转换(感谢@Wildcard将其包含在中):

如果反复出现此问题,您可能希望检查如何将密钥安装到
/etc/apt/trusted.gpg.d/
。我遇到了一个问题,试图通过运行
gpg--keyring/etc/apt/trusted.gpg.d/mine.gpg
列出keyring的内容会导致文件被创建为不受支持的keybox文件。随后,将密钥添加到该密钥环不允许使用该密钥

还值得注意的是,显然没有理由使用
apt key add
。从手册页:

不应使用此命令,而应将钥匙圈直接放置在 具有描述性名称和名称的/etc/apt/trusted.gpg.d/目录 “gpg”或“asc”作为文件扩展名

因此,如果您正在使用apt key add,您可以考虑直接复制文件;博士:是对的。您可以使用以下方法将钥匙盒转换为钥匙圈:

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

(更详细地描述我遇到了什么以及我是如何解决的:)

我在尝试遵循fluentd安装说明的修改版本时遇到了相同的情况,这样我就不必在任何服务器上运行
apt key
。我想出了解决办法;以下是我的笔记:

我正在读的说明:

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

curl https://packages.treasuredata.com/GPG-KEY-td-agent | apt-key add -
但是我想把密钥转换成一个keyring,这样我就可以把它放在一个目录中,而不是在每台服务器上运行一个命令

我用了一些我不久前写的笔记来做类似的事情:

就在那时,我遇到了你在这里举例说明的问题

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

# 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/
# 
#head-n2/etc/os发行版
NAME=“Ubuntu”
VERSION=“18.04.2 LTS(仿生海狸)”
#ls
GPG密钥td代理
#文件GPG密钥td代理
GPG密钥td代理:PGP公钥块公钥(旧)
#gpg—无默认keyring—keyring./tempfile.gpg—导入。/gpg密钥代理
gpg:keybox./tempfile.gpg'已创建
gpg:密钥901F9177AB97ACBE:已导入公钥“珍宝数据公司(珍宝代理官方签名密钥)”
gpg:处理的总数:1
gpg:进口:1
#gpg--无默认keyring--keyring./tempfile.gpg--导出>td-agent-keyring.gpg
#文件*
GPG密钥td代理:PGP公钥块公钥(旧)
td-agent-keyring.gpg:gpg密钥公开环,创建于2016年12月27日星期二08:18:20
tempfile.gpg:gpg keybox数据库版本1,创建于2019年7月20日星期六02:36:45,最后一次维护时间为2019年7月20日星期六02:36:45
tempfile.gpg~:gpg keybox数据库版本1,创建于2019年7月20日星期六02:36:45,最后一次维护时间为2019年7月20日星期六02:36:45
#mv td-agent-keyring.gpg/etc/apt/trusted.gpg.d/
# 
您可以使用gpg的
--dearmor
选项将
apt
trusted.gpg.d
中拒绝的ASCII铠装密钥转换为二进制格式,这正是
apt
所期望的格式

gpg --dearmor keyfile

感谢您发布转换文件格式的命令。我在上面的回答中提到了这一点。如果您喜欢我得到警告“gpg:警告:未导出任何内容”,可能您使用的是相对路径。尝试在文件名前加上./。
gpg --dearmor keyfile