我想为我们的应用程序创建一个自己的存储库。我之前用 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 签名:
- 包裹本身上的签名,带有
dpkg-sig
或 或debsign
。 - 存储库元数据上的签名。
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 签名)。