使用GnuPG验证文件

2017-07-24|Categories: Linux|

一直以来都是用sha256sum来验证文件的完整性,这次下载了php-5.3.27.tar.gz,因为版本过于老旧,已经找不到对应的sha256校验和字符串,还好官方提供了php-5.3.27.tar.gz.asc签名文件用于校验。

虽然知道.asc文件的作用,但怎么用却不知道,只能求助Google,很快就找到了Apache官方验证教程,简洁明了,照着葫芦画瓢很快完成了验证。

第一步,找出签名文件的公钥ID

倒数第二行末尾显示是5DA04B5D

[root@www-cent69 15:46:03 tools]# gpg --verify php-5.3.27.tar.gz.asc php-5.3.27.tar.gz
gpg: directory '/root/.gnupg' created
gpg: new configuration file '/root/.gnupg/gpg.conf' created
gpg: WARNING: options in '/root/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring '/root/.gnupg/pubring.gpg' created
gpg: Signature made Wed 27 Nov 2013 04:59:30 PM CST using DSA key ID 5DA04B5D
gpg: Cannot check signature: No public key

第二步,获取公钥

有两种方法获取公钥:

根据ID从公钥服务器获取

[root@www-cent69 15:46:03 tools]# gpg --keyserver pgp.mit.edu --recv-key 5DA04B5D
gpg: keyring '/root/.gnupg/secring.gpg' created
gpg: requesting key 5DA04B5D from hkp server pgp.mit.edu
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 5DA04B5D: public key "Stanislav Malyshev (PHP key) <smalyshev@gmail.com>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1

从官方网站下载.key文件并导入

例如Nginx官方网站提供了主要开发人员的公钥,下载到本地是后缀名为.key的纯文本文件,使用如下命令导入:

gpg --import file_name.key

效果和前一种方法相同。

第三步,验证文件

[root@www-cent69 15:46:03 tools]# gpg --verify php-5.3.27.tar.gz.asc php-5.3.27.tar.gz
gpg: Signature made Wed 27 Nov 2013 04:59:30 PM CST using DSA key ID 5DA04B5D
gpg: Good signature from "Stanislav Malyshev (PHP key) <smalyshev@gmail.com>"
gpg:                 aka "Stanislav Malyshev (PHP key) <stas@php.net>"
gpg:                 aka "Stanislav Malyshev (PHP key) <smalyshev@sugarcrm.com>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: F382 5282 6ACD 957E F380  D39F 2F79 56BC 5DA0 4B5D

「Good signature」表示php-5.3.27.tar.gz这个文件确实是Stanislav Malyshev签名发布的,没有被他人篡改,也没有在下载过程中损坏。

但Stanislav Malyshev这个人可信吗?我们获取的公钥本身可信吗?因为任何人都可以向公钥服务器上传公钥,我们还必须验证公钥的可靠性,也就是验证「fingerprint(公钥指纹)」。

幸运的是,PHP官网公布了每一个发布版本签名对应的公钥指纹:

Stanislav Malyshev的信息没有出现在5.3版,但出现在5.4版,证明这位老兄确实是PHP的开发者,和第三步输出的最后一行比对,两个指纹完全一致,证明公钥可靠。

经过以上的步骤,我们基本可以确认下载的文件是可信的、完整的。

再次强调:公钥必须可靠

前面提到的公钥指纹和.key文件都是从软件的官方网站下载的,官方网站通常是获取这些文件和信息的权威来源。

但还有可能出现一种极端情况,比如HowToGeek提到Linux Mint发行版的官网曾经被攻破,服务器上的文件全部被替换……这种突发情况恐怕只能通过及时关注行业新闻来了解、规避。

参考资料

Leave A Comment