apt-key add name-of-file
这个命令在我按喇叭后似乎还是起作用了,所以我能继续前进,但我想知道将来需要做什么。
apt-key add name-of-file
apt
的信任密钥库中,通过将其复制到/etc/apt/trusted.gpg.d/
。相反,将其放在像/etc/apt/keyrings/
这样的地方。(你可能需要首先创建那个keyrings
目录。)这个位置没有什么特别之处,它只是Ubuntu 22.04中man 5 sources.list
和相关的Debian Wiki条目推荐的约定。apt
也不知道这个密钥的存在。最后一步是修改该存储库的特定.list
文件,告诉apt在哪里找到该特定存储库的密钥。
/etc/apt/sources.list.d/<example>.list
,在deb
和URL之间添加[signed-by=/etc/apt/keyrings/<your-keyfile-name>.gpg]
/etc/apt/trusted.gpg.d/
目录下有密钥环文件,您可以将它们原封不动地移动到/etc/apt/keyrings/
目录中,然后更新所有相应的.list
文件,使每个文件都有一个指向自己密钥的signed-by
字段。/etc/apt/trusted.gpg
密钥环文件中除了官方仓库密钥之外还有其他密钥,this answer详细介绍了定位和删除这些密钥的步骤。然后,您可以按照上述相同的步骤以更安全的方式设置它们。(也可以从该密钥环中导出它们,但具体步骤留给读者自行探索。)gpg --no-default-keyring --keyring <output-file-name>.gpg --keyserver <some.keyserver.uri> --recv-keys <fingerprint>
.sources
文件而不是.list
文件的较新、更详细的Deb822
格式。这需要更多工作,但我个人认为结果更易读。参考资料:
下载相关密钥
wget -O - https://download.teamviewer.com/download/linux/signature/TeamViewer2017.asc > ~/teamviewer.key
验证文件类型
file ~/teamviewer.key
应该是PGP公钥块 公钥(旧)
创建一个密钥环
gpg --no-default-keyring --keyring ./teamviewer_keyring.gpg --import teamviewer.key
这个文件仍然不是一个可以添加到/etc/apt/trusted.gpg.d/的有效密钥,因为它是一个密钥环,但是我们可以从密钥环中提取密钥
gpg --no-default-keyring --keyring ./teamviewer_keyring.gpg --export > ./teamviewer.gpg
这个文件是您要移动到受信任密钥文件夹的密钥
sudo mv ./teamviewer.gpg /etc/apt/trusted.gpg.d/
开心的 sudo apt update
!!!
/etc/apt/trusted.gpg.d/
目录下。请查看得票最多的答案,以获得更好的解决方案。 - Amedee Van Gasseapt-key add
只是将gpg密钥附加到受信任的全局APT密钥环中。这类似于添加local_repo.list
到/etc/apt/sources.list.d/
而不是使用add-apt-repository dep/link/to/repo version
的首选方法,后者会将消息附加到全局sources.list
文件中。/usr/share/keyrings
,它可以是.asc或.gpg文件。我不确定区别,但我知道全局密钥环文件是二进制文件,不是纯文本文件。curl https://www.mongodb.org/static/pgp/server-4.2.asc | sudo tee -a /usr/share/keyrings/buster-mongodb-org-4_2.asc
为apt添加一个源条目,指向这个新的密钥环。
例如,如果您的存储库文件位于/etc/apt/sources.list.d/mongodb-org-4_2.list
,运行以下命令添加密钥文件:
echo "deb [signed-by=/usr/share/keyrings/buster-mongodb-org-4_2.asc] https://repo.mongodb.org/apt/debian buster/mongodb-org/4.2 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-4_2.list
server-4.2.asc
是如何变成本地端的buster-mongodb-org-4_2.asc
。那个文件名有重要的意义吗? - fIwJlxSzApHEZIl[ arch=amd64,arm64 ]
。我还不确定如何添加这个以及密钥路径的分隔符。 - mchid[arch=amd64,arm64 signed-by=...]
- Moshe Katz[signed-by=]
声明在sources.list
中使用的密钥。此脚本将帮助您安装 APT 存储库的 PGP 密钥。
此脚本支持最多 2 个参数:
此脚本有一个配置文件 /usr/local/etc/add-apt-key.conf
,其中可以设置以下变量:
keypath
:存储转换后密钥的路径 - 默认为 /etc/apt/keyrings
verbosity
:如果设置为 Yes - 显示额外输出removetmp
:如果设置为 Yes - 删除输入(未转换)文件示例 1:(PWD=/root
)
sudo add-apt-key https://mariadb.org/mariadb_release_signing_key.asc /usr/share/keyrings/
将在 /root
下载密钥,进行转换并保存为
/usr/share/keyrings/mariadb_release_signing_key.gpg
示例 2:(PWD=/home/user
)
sudo add-apt-key /root/mariadb_release_signing_key.asc /usr/share/keyrings/mariadbkey
将使用 /root
中的现有密钥,进行转换并保存为
/usr/share/keyrings/mariadbkey.gpg
示例 3:(PWD=/home/user
)
sudo add-apt-key mariadb_release_signing_key.asc mariadbkey
将使用 /home/user
中的现有密钥,进行转换并保存为
/etc/apt/keyrings/mariadbkey.gpg
安装 PGP 密钥后,还可以将密钥和存储库添加到 /etc/apt/sources.list
通过将相应的存储库行添加到 /etc/apt/sources.list
来完成密钥安装
通过运行以下命令进行安装:
sudo curl -L https://raw.githubusercontent.com/ameinild/add-apt-key/master/add-apt-key -o /usr/local/bin/add-apt-key
sudo curl -L https://raw.githubusercontent.com/ameinild/add-apt-key/master/add-apt-key.conf -o /usr/local/etc/add-apt-key.conf
sudo chmod a+rx /usr/local/bin/add-apt-key
/etc/apt/keyrings
。 - Artur Meinildapt-manage
,我认为这是继续前进的方式。 - Lockszmithapt-key add
替换为gpg --dearmor
:
curl [KEYURL] | sudo gpg --dearmor --yes -o /etc/apt/trusted.gpg.d/[KEYFILE].gpg
然而,这并不推荐使用(除非作为apt-key的替代),因为受信任目录中的所有密钥都是无条件信任的;最好将输出放在一个(非全局)可信任的目录中(正如其他人建议的那样),并让每个源指定要信任的密钥。这里的所有答案都很棒,我从中学到了很多。
根据 @mesterlion 的评论,截至目前为止,有一个工具可以完成所有这些任务,并且正确地进行维护 - 这个工具是由 Pop!_OS 团队开发的。
这个工具就是 apt-manage
,它是 RepoLib 模块的一部分,在版本 2 中引入了 key
子命令。
所以在 Pop!_OS 22.04 中,安装过程将如下所示:
sudo apt install --yes apt-manage
cd ~ # recommended
sudo apt update \
&& sudo apt install --yes python3-gnupg python3-debian \
&& curl -LO https://github.com/pop-os/repolib/releases/download/2.0.0/python3-repolib_2.0.0_all.deb \
&& sudo apt install ./python3-repolib_2.0.0_all.deb \
&& apt-manage --help
README.md
的安装部分。
这是我系统中一组apt-manage调用的示例:
# Adding PPA
sudo apt-manage add --terse --format=sources ppa:ppa:alessandro-strada/ppa
# Adding APT source and assinging a key
sudo apt-manage add --terse --format=sources --name Microsoft --identifier packages-microsoft-com 'deb [arch=amd64] https://packages.microsoft.com/ubuntu/22.04/prod jammy main'
# Assigning a key via URL
sudo apt-manage key packages-microsoft-com --url=https://packages.microsoft.com/keys/microsoft.asc
# R-Project needed some additional love - because they do something 'different':
sudo apt-manage add --terse --format=sources --name R-Project --identifier cloud-r-project-org 'deb [arch=amd64] https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/ ""_""'
# Specific to R-Project, as one of the values are empty and the command line can' pass it effectively.
sudo sed -i /etc/apt/sources.list.d/cloud-r-project-org.sources -Ee 's/""_""//g'
# Assigning a key via fingerprint
sudo apt-manage key cloud-r-project-org --fingerprint=E298A3A825C0D65DFD57CBB651716619E084DAB9
# After all were added, run update.
sudo apt update
set -e
export DEBIAN_FRONTEND=noninteractive
apt-get update \
&& apt-get install --yes --no-install-recommends \
apt-transport-https ca-certificates \
wget gnupg software-properties-common lsb-release \
curl jq bash-completion
has() { command -v "$1" > /dev/null; }
# Try differnt ways of installing apt-manage
# First let's hope there is package ready for installation
has apt-manage || apt-get install --yes apt-manage || true
# If it still doesn't exist, let's get it from repo
if ! has apt-manage; then
FILENAME=python3-repolib_2.0.0_all.deb
URL="https://github.com/pop-os/repolib/releases/download/2.0.0/$FILENAME"
if [ ! -e "/tmp/$FILENAME" ]; then
apt-get install --yes python3-gnupg python3-debian
curl -Lo "/tmp/$FILENAME" "$URL"
fi
apt-get install "/tmp/$FILENAME"
fi
apt-manage add --identifier download-docker-com-pqb --name Docker \
--terse --format=sources \
"$( printf "deb [arch=%s] %s %s %s" \
"$(dpkg --print-architecture)" \
"https://download.docker.com/linux/ubuntu" \
"$(lsb_release --codename --short)" \
"stable"
)"
apt-manage key download-docker-com-pqb \
--url=https://download.docker.com/linux/ubuntu/gpg
apt-manage
(来自repolib
) - MestreLionapt-manage
这个命令。看起来这个命令只是替换了sudo tee
这一行,用于写入.list
文件,但是下载密钥的curl
和验证密钥的gpg
仍然是必需的。无论如何,这是工具箱中的另一个工具。谢谢@MestreLion! - Lockszmithapt-manage
确实有选项可以从URL下载GPG密钥并将其与存储库关联起来。默认情况下,它使用/etc/apt/keyrings
目录,这也是Debian推荐的方式。 - MestreLion.deb
文件,或者按照首页README中的说明自己创建一个:https://github.com/pop-os/repolib - MestreLionapt
中:add-apt-repository "deb https://apt.pop-os.org/release $(lsb_release -cs) main"
。这可能是最佳途径(自动更新),但请确保还创建一个apt
“pin”,以便它只从该存储库中获取repolib
软件包,而不是其他软件包!。请参阅https://wiki.debian.org/AptConfiguration#Prevent.2Fselective_installation_from_third-party_a_repository - MestreLion*.asc
文件,你可以直接使用--dearmor
命令解密它。curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
install -o root -g root -m 644 microsoft.gpg /etc/apt/trusted.gpg.d/
用于apt
的密钥存储在/etc/apt/trusted.gpg.d/
中。apt-key
为您管理这些密钥环,但现在它已被弃用,您需要自己选择一个适当的文件名<KEYRING>
来管理密钥环。
如果您已经有了作为本地文件的密钥<FILE>
,请运行
gpg --no-default-keyring --keyring=gnupg-ring:/etc/apt/trusted.gpg.d/<KEYRING>.gpg --import <FILE>
<URL>
读取密钥,请运行curl -sSfL <URL> | gpg --no-default-keyring --keyring=gnupg-ring:/etc/apt/trusted.gpg.d/<KEYRING>.gpg --import
gnupg-ring:
,以便创建与apt
兼容(传统)v4格式的密钥环,而不是(较新的)keybox v1格式。gpg key: EBB4CCF6A72BC110 | 55D9B3F8D3E163D4CED77D9CEBB4CCF6A72BC110
到这个 PPA:https://launchpad.net/~ufleisch/+archive/ubuntu/kid3
,我应该如何修改你提到的命令呢?我尝试了:curl -sSfL https://keyserver.ubuntu.com/pks/lookup?fingerprint=on&op=index&search=0x55D9B3F8D3E163D4CED77D9CEBB4CCF6A72BC110 | gpg --no-default-keyring --keyring=gnupg-ring:/etc/apt/trusted.gpg.d/<KEYRING>.gpg --import
,但是没有成功。 - Jags<URL>
:https://launchpad.net/~ufleisch/+archive/ubuntu/kid3
?(2)我是否应该用gnupg-ring.gpg
替换<KEYRING>.gpg
?非常感谢。 - Jagscurl -sSfL 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x55d9b3f8d3e163d4ced77d9cebb4ccf6a72bc110' | sudo gpg --no-default-keyring --keyring=gnupg-ring:/etc/apt/trusted.gpg.d/kid.gpg --import
- kynancurl -sSfL <URL> <URL> <URL>
?谢谢。 - Jagssudo apt update
时,我遇到了很多错误,例如:W: http://ppa.launchpad.net/ufleisch/kid3/ubuntu/dists/hirsute/InRelease: The key(s) in the keyring /etc/apt/trusted.gpg.d/kid.gpg are ignored as the file is not readable by user '_apt' executing apt-key.
非常感谢。 - Jagssudo chmod 0644 /etc/apt/trusted.gpg.d/kid.gpg
- kynan
wget -O - https://host.domain.tld/path/to/<keyfile>.<ext> | gpg --dearmor > /usr/local/share/keyrings/<your-keyfile-name>.gpg
一步解除密钥的装甲。 - Hrobkygpg --dearmor
可行的密钥的例子,以及一个不可行的例子? 例如,我是否正确地认为这个mopidy密钥可以与--dearmor
一起使用,但这个google密钥不能?请注意,将google密钥直接传递给gpg --dearmor
仍然以错误代码0退出,这说明...它能正常工作吗? - laurgpg --dearmor
进行处理,我还没有遇到任何无法使用的密钥。 - laur--dearmor
后 apt 仍无法识别的密钥,这促使我去寻找我的回答中的转换方法……但是我没有记录下具体哪些密钥。一般来说,默认情况下通过--dearmor
进行处理不会有任何问题(如果密钥不是 ascii-armored 的话,gpg 会顺利退出而不做任何更改)。如果 apt 在处理后的密钥上出现问题,那么再尝试进行二进制到二进制的转换解决方法。 - Askeliless my-file.ext
,按 Q 键退出),如果文件经过加密,则会有可读的标头,如“BEGIN PGP PUBLIC KEY BLOCK”。如果是二进制文件,在打开前less
将告诉你它是二进制文件,因为试图显示其内容将呈现乱码/乱码化。 - Jivan Palapt
命令自动替换已弃用的行为呢?根据描述,似乎可以很容易地编写脚本来实现。 - Snackoverflow/etc/apt/trusted.gpg.d/
目录中有Ubuntu密钥,例如ubuntu-keyring-2012-cdimage.gpg
和ubuntu-keyring-2018-archive.gpg
。而且这些密钥没有相应的.list
文件。所以我猜测不能盲目地移动该目录中的所有内容。 - Snackoverflowadd-apt-repository ppa:user/ppa-name
将会在/etc/apt/sources.list.d
中添加一个文件,同时也会在/etc/apt/trusted.gpg.d
中添加相应的密钥。PPA是否应该得到同样的对待呢? - Dodgyrabbit/etc/apt/sources.list.d
,而另一些则位于/etc/apt/trusted.gpg
)。你还可以提到,在arch=amd64
之后可以加上signed-by
,用一个空格隔开。这可能看起来很明显,但有些人(包括我)可能希望得到确认 - 这样才能完整回答问题!除此之外,非常好的答案! - Rikadd-apt-repository
会得到更新,或者还会有其他工具能够自动化这个过程... - Compholioapt-add-repository
仍然使用apt-key add
!这才是整个问题的根源所在!而你甚至没有提到它,一句话都没有。 - anon[arch=amd64]
,则您必须将其放在括号内,例如deb [arch=amd64 signed-by=/etc/apt/keyrings/vivaldi-release.gpg] http://repo.vivaldi.com/stable/deb/ stable main
,否则apt会报语法错误:列表文件中的第3个条目格式不正确
。 - Ingo Steinke