UNIX / Linux PGP TarBall 文件签名密钥验证
PGP 是 Pretty Good Privacy 的缩写。它提供加密隐私和身份验证。PGP 通常用于加密和解密电子邮件和文件。我们也可以使用从互联网下载的软件的 PGP 签名。对于所有基于 FOSS 的项目,您应该下载 PGP 签名和 MD5/SHA 哈希并在使用它们之前对其进行验证。Linux 和许多其他类 UNIX 操作系统可以使用 GNU Privacy Guard。但是,任何符合 OpenPGP 的程序都应该能够成功地与软件配合使用。以下说明假定您正在使用 GNU Privacy Guard。
教程详细信息 | |
---|---|
难度等级 | 中间的 |
Root 权限 | 不 |
要求 | Linux 或 Unix 上的 gpg 命令 |
预计阅读时间 | 7 分钟 |
步骤 1. 下载 tar ball/软件以及 PGP 密钥进行验证
例如,您将下载 nginx Web 服务器并使用 PGP 进行验证。使用wget 命令获取最新版本:
让我们使用 ls 命令列出文件,输入:
示例输出:
$ cd /tmp
$ wget http://nginx.org/download/nginx-1.18.0.tar.gz
$ wget https://nginx.org/download/nginx-1.18.0.tar.gz.asc
$ ls -l
total 620 -rw-rw-r-- 1 vivek vivek 1039530 Apr 21 20:03 nginx-1.18.0.tar.gz -rw-rw-r-- 1 vivek vivek 455 Apr 21 20:03 nginx-1.18.0.tar.gz.asc
步骤 2. 检查 PGP 签名/验证
输入以下 gpg 命令:示例输出:
$ gpg nginx-1.18.0.tar.gz.asc
## OR ##
$ gpg --with-fingerprint nginx-1.18.0.tar.gz.asc
gpg: WARNING: no command supplied. Trying to guess what you mean ... gpg: assuming signed data in 'nginx-1.18.0.tar.gz' gpg: Signature made Tuesday 21 April 2020 07:43:35 PM IST gpg: using RSA key 520A9993A1C052F8 gpg: Can't check signature: No public key
但是,gpg 命令无法检查签名,因为我们在本地 Linux / Unix 服务器或工作站中没有作者的公钥 520A9993A1C052F8。因此,我们需要从密钥服务器(例如 pgpkeys.mit.edu)获取公钥,或从作者的网站下载。
步骤 3. Linux 或 Unix 命令从密钥服务器获取公钥
语法如下:
gpg --recv-key <publicKey> ## we can also get keys from speifici key server ## gpg --keyserver pgpkeys.mit.edu --recv-key <publicKey>
尝试获取公钥A524C53E,输入:
$ gpg --recv-key 520A9993A1C052F8
$ gpg --verbose --recv-key 520A9993A1C052F8
gpg: data source: http://hkps.pool.sks-keyservers.net:11371 gpg: armor header: Version: SKS 1.1.6 gpg: armor header: Comment: Hostname: sks.pod02.fleetstreetops.com gpg: key 520A9993A1C052F8: number of dropped non-self-signatures: 9 gpg: pub rsa2048/520A9993A1C052F8 2011-11-27 Maxim Dounin <mdounin@mdounin.ru> gpg: using pgp trust model gpg: key 520A9993A1C052F8: public key "Maxim Dounin <mdounin@mdounin.ru>" imported gpg: Total number processed: 1 gpg: imported: 1
如您所见,Maxim Dounin <mdounin@mdounin.ru>及其密钥一起列在Nginx 项目网站上:
步骤 4. 在 Linux / Unix 上验证已下载的 Nginx 软件的 PGP 签名
现在,尝试再次验证软件签名,如下所示:
$ gpg --verify nginx-1.18.0.tar.gz.asc nginx-1.18.0.tar.gz
您应该看到如下输出:
gpg: Signature made Tuesday 21 April 2020 07:43:35 PM IST
gpg: using RSA key 520A9993A1C052F8
gpg: Good signature from "Maxim Dounin <mdounin@mdounin.ru>" [unknown]
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: B0F4 2533 73F8 F6F5 10D4 2178 520A 9993 A1C0 52F8
步骤 5. 从 Web 服务器获取公钥的命令
再次使用wget 命令从 Web 服务器获取公钥:
$ wget https://nginx.org/keys/mdounin.key
从 mdounin.key 文件导入密钥,输入:
$ gpg --import mdounin.key
gpg: key 520A9993A1C052F8: 2 signatures not checked due to missing keys gpg: key 520A9993A1C052F8: public key "Maxim Dounin <mdounin@mdounin.ru>" imported gpg: Total number processed: 1 gpg: imported: 1 gpg: marginals needed: 3 completes needed: 1 trust model: pgp gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
现在,尝试使用 gpg 密钥再次验证软件签名:
$ gpg gpg --verify nginx-1.18.0.tar.gz.asc nginx-1.18.0.tar.gz
签名是好的,但您不信任此 PGP 密钥。换句话说,该文件没有被篡改。但是,您还需要验证密钥 520A9993A1C052F8 是由真正的 Nginx 作者 Maxim Dounin <mdounin@mdounin.ru> 创建的,而不是由其他人创建的。
那么,我如何建立信任并将 Maxim Dounin 的 PGP 密钥标记为受信任?
这有点复杂,因为您从未与 Maxim Dounin <mdounin@mdounin.ru> 面对面见过面。要保证密钥的真实性,您可以使用自己的私钥对其进行签名并将其邮寄回其所有者。这是一种建立信任关系的简单易行的方法。另一个快速选项是使用以下命令:
gpg --edit-key {user@example.com} trust
例如:
$ gpg --edit-key mdounin@mdounin.ru trust
警告:不要盲目信任密钥以消除警告。对于下载的软件验证,您不需要设置信任网。以下示例仅用于演示目的,因为我从未见过 Nginx 背后的作者/人员或为他担保。
gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. pub rsa2048/520A9993A1C052F8 created: 2011-11-27 expires: never usage: SC trust: unknown validity: unknown sub rsa2048/57A82F1DD345AB09 created: 2011-11-27 expires: never usage: E [ unknown] (1). Maxim Dounin <mdounin@mdounin.ru> pub rsa2048/520A9993A1C052F8 created: 2011-11-27 expires: never usage: SC trust: unknown validity: unknown sub rsa2048/57A82F1DD345AB09 created: 2011-11-27 expires: never usage: E [ unknown] (1). Maxim Dounin <mdounin@mdounin.ru> Please decide how far you trust this user to correctly verify other users' keys (by looking at passports, checking fingerprints from different sources, etc.) 1 = I don't know or won't say 2 = I do NOT trust 3 = I trust marginally 4 = I trust fully 5 = I trust ultimately m = back to the main menu Your decision? 5 Do you really want to set this key to ultimate trust? (y/N) y pub rsa2048/520A9993A1C052F8 created: 2011-11-27 expires: never usage: SC trust: ultimate validity: unknown sub rsa2048/57A82F1DD345AB09 created: 2011-11-27 expires: never usage: E [ unknown] (1). Maxim Dounin <mdounin@mdounin.ru> Please note that the shown key validity is not necessarily correct unless you restart the program. gpg> q
现在,尝试再次验证软件签名:
$ gpg --verify nginx-1.18.0.tar.gz.asc nginx-1.18.0.tar.gz
gpg: Signature made Tuesday 21 April 2020 07:43:35 PM IST gpg: using RSA key 520A9993A1C052F8 gpg: checking the trustdb gpg: marginals needed: 3 completes needed: 1 trust model: pgp gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u gpg: Good signature from "Maxim Dounin <mdounin@mdounin.ru>" [ultimate]
由于您已经进入信任网络,因此您应该不会在屏幕上看到任何警告消息。
如何删除“Maxim Dounin <mdounin@mdounin.ru>”密钥?
列出并删除不需要的键的语法如下:
$ gpg --list-key
$ gpg --delete-keys B0F4253373F8F6F510D42178520A9993A1C052F8
## or ##
$ gpg --delete-keys 520A9993A1C052F8
结论
在本快速教程中,您了解了 PGP 以及如何在 Linux 或类 Unix 系统下验证从互联网下载的软件的 PGP 签名。有关更多信息,请参阅以下资源:
- GNU 隐私卫士主页和文档。
- 手册页:gpg