自己的 apt 存储库签名问题

自己的 apt 存储库签名问题

我想为我们的应用程序创建一个自己的存储库。我之前用 pgp 创建了一个主密钥和签名子密钥,并使用以下命令对 deb 包进行签名:

dpkg-sig --sign builder sample.deb

然后我用 reprepro 创建 repo:

reprepro --ask-passphrase -b base includedeb all sample.deb

Reprepro 创建必要的签名文件:

./conf:
distributions  options

./db:
checksums.db  contents.cache.db  packages.db  references.db  release.caches.db  version

./dists:
all

./dists/all:
InRelease  main  Release  Release.gpg

./dists/all/main:
binary-amd64  binary-i386

./dists/all/main/binary-amd64:
Packages  Packages.gz  Release

./dists/all/main/binary-i386:
Packages  Packages.gz  Release

./pool:
main

./pool/main:
s

./pool/main/s:
sample

./pool/main/s/sample:
sample_2.2.48.9015_all.deb

我在客户端机器上安装了公钥,但在安装包后收到此消息:

WARNING: The following packages cannot be authenticated!
  sample
Install these packages without verification? [y/N]

为什么?

答案1

GPG 签名非常复杂。对于 APT 存储库,有两层 GPG 签名:

  1. 包裹本身上的签名,带有dpkg-sig或 或debsign
  2. 存储库元数据上的签名。

SignWith您之所以看到该消息,是因为 APT 未在您的存储库元数据上看到任何签名。您可以通过添加到 reprepro 配置来实现这一点。您可以在我写的一篇综合博客文章中阅读更多内容,这里

您可以SignWith通过查找名为Release.gpg或 的文件来验证是否已成功运行InRelease。如果找到名为 的文件InRelease,请查看文件内容并确保在底部找到 GPG 签名。如果是,则表示 reprepro 已正确生成签名。请记住,除非通过 HTTPS 提供服务,否则 GPG 签名的存储库仍然容易受到大量中间人攻击。

我还建议通过运行来检查公共 GPG 密钥是否已正确导入到客户端系统apt-key list。如果您在列表中没有看到密钥,则应使用来添加它apt-key add filename

需要注意的是,Ubuntu 和 Debian 不验证软件包的 GPG 签名——默认情况下禁用该功能,而且很难启用。我建议不要对软件包进行 GPG 签名。

另请注意,您应该通过 HTTPS 分发您的存储库,以避免大量安全漏洞(即使使用 GPG 签名)。

相关内容