GPG 的基础使用:交换公钥
要想通过 GPG 验证来自的别人的信息,我们首先需要跟他人交换公钥。
整个交换过程分为四步:获取对方的公钥、导入公钥、验证并签名、设置信任级别。
获取对方的公钥
这个没什么好说,用通信工具让对方把公钥发给你,甚至用电话让对方一个个字母念出来都是可以的。
这里我们以导入 GitHub 的 GPG 公钥为例。
在 GitHub 上,所有用户的 GPG 公钥都可以通过 https://github.com/<username>.gpg
地址获得,而我们在网页上的操作是由 web-flow
账号进行的,所以我们可以通过 github.com/web-flow.gpg 取得它的密钥。
导入公钥
获取之后,我们需要将公钥导入我们的公钥库。
$ gpg --import web-flow.gpg
gpg: key 4AEE18F83AFDEB23: public key "GitHub (web-flow commit signing) <noreply@github.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
随后我们可以使用 gpg --list-keys
命令确认导入成功。
gpg --list-keys
/home/sunxyw/.gnupg/pubring.kbx
-------------------------------
<这部分是你自己的密钥信息>
pub rsa2048 2017-08-16 [SC]
5DE3E0509C47EA3CF04A42D34AEE18F83AFDEB23
uid [ unknown] GitHub (web-flow commit signing) <noreply@github.com> <-- 看到这个就算成功
核对并签名验证
为了防止公钥遭到篡改,一般我们需要联系对方本人核对公钥的指纹(fingerprint)。
我们先进入 GPG 控制台,gpg --edit-key <name>
。
这里的 <name>
可以是:
- 密钥ID(例:5DE3E0509C47EA3CF04A42D34AEE18F83AFDEB23)
- 用户名(例:GitHub)
- 邮箱(例:noreply@github.com)
我个人建议使用密钥ID以确保唯一。
进入之后,我们可以使用 fpr
命令输出当前密钥的指纹:
gpg> fpr
pub rsa2048/4AEE18F83AFDEB23 2017-08-16 GitHub (web-flow commit signing) <noreply@github.com>
Primary key fingerprint: 5DE3 E050 9C47 EA3C F04A 42D3 4AEE 18F8 3AFD EB23
然后与对方核对此处输出的指纹,如果一致则说明公钥没有遭到篡改。
此处 GitHub 的指纹可在 docs.github.com/cn/authentication/... 找到。
核对无误后,我们需要进行签名以表示我们验证了这一密钥的正确性。
gpg> sign
pub rsa2048/4AEE18F83AFDEB23
created: 2017-08-16 expires: never usage: SC
trust: marginal validity: unknown
Primary key fingerprint: 5DE3 E050 9C47 EA3C F04A 42D3 4AEE 18F8 3AFD EB23
GitHub (web-flow commit signing) <noreply@github.com>
Are you sure that you want to sign this key with your
key <你的密钥>
Really sign? (y/N) y
最后输入 save
保存退出。
设置信任级别
GPG 的信任级别分为以下几个等级:
- Ultimate:绝对信任,只会出现在你自己的密钥上。
- Full:完全信任,你相信这个密钥,并信任它可以很好地管理签发密钥。使用这个密钥签名的其他密钥也会受到信任。比如,你完全信任了
小明的密钥
,那么由小明签名过的小美的密钥
也会受到信任。 - Marginal:相对信任,你相信这个密钥本身,但不确定它签名的密钥是否一定正确。如果一个密钥被至少三个
Marginal
级别的密钥签名,那么该密钥也是可信的。 - Never:绝不信任,这个密钥是完全不可信的。这也许以为着密钥的所有者并不能确保它签名的密钥有效,或是该密钥已被泄露因此不再可信。
- Unknown:未知,这是密钥的默认信任级别,该级别的密钥不会被信任。
如果设置信任级别并没有明确的规定或标准,因此完全取决于你自己。
比如我们想完全信任 GitHub 的公钥。
$ gpg --edit-key <name>
gpg> trust
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? 4
gpg> save
最后吧
执行 git log --show-signature
即可查看提交的签名信息。
可以看到我们成功识别到了 GitHub 的提交的签名信息。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: