利用GPG签名验证文件的完整及可靠性

如果你想要同时验证下载文件的可靠性(拥有者)和完整性(内容),你需要依赖于加密签名。本教程中,将描述如何使用GnuPG(GNU Privacy Guard)来检查文件的可靠性和完整性。

本例中将验证一个从 https://opensuse.org 上下载的磁盘镜像。这个网站中,发行商会提供他们的公钥,还有它用于密钥验证的指纹。

Public Key and Fingerprint

至于下载的文件,发行商提供它了相关的利用GPG签名的含有sha256校验值的文件。

Download Files

安装 GnuPG 并且生成一个键对

在Debian、Ubuntu和其他Debian衍生版上:

sudo apt install gnupg 

在Fedora、CentOS或者RHEL上:

sudo yum install gnupg

完成安装后,生成一个键对。

Gen Key

在生成键对期间,用户会被要求提供姓名和email,还有保护私钥的密码。用户同样也可以选择键对何时过期(默认不会过期)。依赖于用户选择的key的大小(在1024和4096位之间),key生成会花上几分钟或者更多,同时它要求收集来自你桌面活动的大量的随机数据。(比如键盘输入、鼠标移动、磁盘访问等等,所以这个时候随便动动鼠标键盘什么的)。

一旦key生成完毕后,公钥和私钥会存储在~/.gnupg目录。

Created

与某个文件和拥有者建立信任

验证下载文件的第一步是与任何提供文件下载的人建立信任。出于此,需要下载这个文件的公钥,并且验证公钥的拥有者是否是他或者她自称的。

在下载完文件拥有者的公钥后,使用gpg命令导入公钥到你的keyring中

gpg --import signing-key.asc

Import

一旦拥有者的公钥导入后,他会像下面那样打印出一个key ID(比如:”3DBDC284”)。记住这个key ID。

现在,运行下面的命令检查导入的公钥的指纹:

gpg --fingerprint 3DBDC284

Fingerprint

你会看到key的指纹字符串。把这个和网站上显示的指纹做对比。如果匹配,你可以选择信任这个文件拥有者的公钥。

一旦你决定相信这个公钥(不是一定要选择相信才能继续),你可以通过编辑key来设置信任级别:

gpg --edit-key 3DBDC284

这个命令会显示GPG提示符,在GPG提示符中输入“trust”,它会让你从1-5之间选择这个key的信任等级。本例中,我决定分配给它“4”,在这之后,输入“sign”用你自己的私钥签名,接着输入在GPG提示符中输入“save”来完成操作。

Trust

要注意的是不需要这样明确地给一个公钥指派信任,通过key的导入隐式地信任往往就够了。

检查导入的key列表:

gpg --list-keys

验证文件的可靠性/完整性

一旦你建立了与文件拥有者和他的/她的公钥之间的信任关系,我们需要验证你从拥有者那边下载的文件的可靠性和完整性了。

本例中,文件拥有者分别公布了一个文件和签名过的.sha256文件。签名所起的作用就是认证含有校验值的文件并且在其中加入一个时间戳。

现在让我们同时下载它的文件和签名的含有校验值的文件:

wget http://verify.iso.mirrors.ustc.edu.cn/opensuse/tumbleweed/iso/openSUSE-Tumbleweed-DVD-x86_64-Snapshot20170529-Media.iso
wget http://download.opensuse.org/tumbleweed/iso/openSUSE-Tumbleweed-DVD-x86_64-Snapshot20170529-Media.iso.sha256

现在验证校验值文件的PGP签名:

gpg --verify openSUSE-Tumbleweed-DVD-x86_64-Snapshot20170529-Media.iso.sha256

Verify

如果命令的输出包含了“Good signature from <文件所属者>”,那么下载的sha256文件就被成功地认证和核实了。如果下载的文件的任何地方在签名后被篡改了,那么验证就会失败。

接着,对镜像文件进行sha256的校验:

sha256sum openSUSE-Tumbleweed-DVD-x86_64-Snapshot20170529-Media.iso

Check SHA256 Sum

与签名过的文件中的sha256值相同,文件是完整且可靠的:

Same

如果有.asc文件,即文件拥有者分别公布了一个文件和它的asc签名文件,一个典型的签名(*.asc)看上去像这样:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: SKS 1.1.6
Comment: Hostname: keyserver.opensuse.org

mQENBEkUTD8BCADWLy5d5IpJedHQQSXkC1VK/oAZlJEeBVpSZjMCn8LiHaI9Wq3G3Vp6wvsP
1b3kssJGzVFNctdXt5tjvOLxvrEfRJuGfqHTKILByqLzkeyWawbFNfSQ93/8OunfSTXC1Sx3
hgsNXQuOrNVKrDAQUqT620/jj94xNIg09bLSxsjN6EeTvyiOmtE9H1J03o9tY6meNL/gcQhx
Bvwuo205np0JojYBP0pOfN8l9hnIOLkA0yu4ZXigoKOVmf4iTjX4NImIWldT+UaWTO18NWcC
rujtgHueytwYLBNV5N0oJIP2VYuLZfSDVYuPllv7c6O2UEOXJsdbQaVuzU1HLocDyipnABEB
AAG0NG9wZW5TVVNFIFByb2plY3QgU2lnbmluZyBLZXkgPG9wZW5zdXNlQG9wZW5zdXNlLm9y
Zz6IRgQQEQIABgUCUDYUmwAKCRDqe/OXAXViPmUFAJ4qUnaohFRMi5V3fkoG3/vveGmmoQCf
X3Dpzenvrxh2dUxz43kICd3FYR6IRgQQEQIABgUCUYUupQAKCRCL2C5vMLlLXOalAJ9vocSA
TjeIXgQQEQgABgUCUgyrzAAKCRAcKw2ikg5vlwJYAP9uJgQKclRgswmqGkdkvgneneKhQA9D
xaGERJUyoIkBHAQQAQIABgUCUvqngQAKCRAICzsK0ePr3YSPCACuauYGWv+G0j5Oy2HpqlL+
=ahxD
-----END PGP PUBLIC KEY BLOCK-----

那我们就这样验证:

gpg --verify file.ext.asc file.ext