我想为 pam 添加一个功能,我认为一个好的起点是下载源libpam-modules
代码。下载时,我注意到这个警告:gpgv: Can't check signature: public key not found
apt-get
当找不到公钥时,官方用于验证源包完整性的方法是什么?
最新版本的ubuntu-keyring
和debian-keyring
包已经安装。
有方法找到相应的公钥并安装它。然而,这本身并不能提供完整性,因为实际上它信任文件的内容dsc
来告诉我使用哪个公钥来验证dsc
文件上的签名。
文件上的 gpg 签名是否是dsc
完整性验证的关键部分?中间人或流氓镜像是否会提供恶意版本的文件,而 gpg 发出的警告是发生坏事的唯一迹象?或者是否有apt-get
其他方法来验证完整性?
在哪里可以找到有关安全模型的官方文档?理想情况下,我希望了解从安装映像到我正在下载的源包的完整信任路径。
下载的完整输出如下:
$ apt-get source libpam-modules
Reading package lists... Done
Building dependency tree
Reading state information... Done
Picking 'pam' as source package instead of 'libpam-modules'
NOTICE: 'pam' packaging is maintained in the 'Bzr' version control system at:
https://code.launchpad.net/~ubuntu-core-dev/pam/ubuntu
Please use:
bzr branch https://code.launchpad.net/~ubuntu-core-dev/pam/ubuntu
to retrieve the latest (possibly unreleased) updates to the package.
Need to get 2,043 kB of source archives.
Get:1 http://dk.archive.ubuntu.com/ubuntu/ trusty/main pam 1.1.8-1ubuntu2 (dsc) [2,510 B]
Get:2 http://dk.archive.ubuntu.com/ubuntu/ trusty/main pam 1.1.8-1ubuntu2 (tar) [1,893 kB]
Get:3 http://dk.archive.ubuntu.com/ubuntu/ trusty/main pam 1.1.8-1ubuntu2 (diff) [147 kB]
Fetched 2,043 kB in 6s (316 kB/s)
gpgv: Signature made Fri 31 Jan 2014 11:12:23 PM CET using RSA key ID 64792D67
gpgv: Can't check signature: public key not found
dpkg-source: warning: failed to verify signature on ./pam_1.1.8-1ubuntu2.dsc
答案1
无需验证文件上的 gpg 签名即可验证源包的完整性dsc
。
每个安装源都有一对名为Release
和的文件Release.gpg
。这两个文件是哈希树的根,可用于验证存档中所有内容的完整性。 上的 gpg 签名Release
是唯一需要验证的签名。
dsc
在将文件放入存储库并通过 间接签名之前,文件上的签名可能起着重要作用Release.gpg
。一旦文件进入存储库,dsc
就可以忽略文件上的签名。
以下是我手动验证完整性的方法。据我所知,apt-get source
验证是一样的。
- 下载
http://dk.archive.ubuntu.com/ubuntu/dists/trusty/Release
并http://dk.archive.ubuntu.com/ubuntu/dists/trusty/Release.gpg
。 - 使用以下方式检查签名
gpg --keyring /etc/apt/trusted.gpg --verify Release.gpg Release
(公钥也可以在中找到/usr/share/keyrings/ubuntu-archive-keyring.gpg
) - 下载
http://dk.archive.ubuntu.com/ubuntu/dists/trusty/main/source/Sources.gz
- 比较从
sha256sum Sources.gz
和获得的哈希值grep main/source/Sources.gz Release
- 比较从
sha256sum pam_1.1.8-1ubuntu2.dsc
和获得的哈希值zcat Sources.gz | grep pam_1.1.8-1ubuntu2.dsc
- 验证文件中找到的哈希值
dsc
:cat pam_1.1.8-1ubuntu2.dsc | sed -e 's/^ //;s/ [1-9][0-9]* / /' | sha256sum -c
答案2
您看到该警告的原因是因为源包由开发人员自己的密钥签名,而您从存储库获得的二进制包由存储库签名密钥签名。由于ubuntu-keyring
仅提供最终存储库的密钥环(debian-keyring
实际上还提供了其所有维护者的公钥),因此apt
找不到密钥并认为该包未经认证。
因此,这里的解决方案是从密钥服务器导入密钥。您也可以在 Launchpad 上查找源包pam
(这里),点击对包进行最后更改的人员的电子邮件地址,然后从那里检查密钥指纹。
在这种情况下,最后一个更改软件包的人是 Stéphane Graber,碰巧他的密钥在debian-keyring
(具体来说,在/usr/share/keyrings/debian-maintainers.gpg
)。您可以安装debian-keyring
软件包,从该密钥环导出他的密钥,然后将该密钥导入您自己的密钥环,以便apt
可以验证它是否已正确签名。