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 的基础使用:交换公钥

核对无误后,我们需要进行签名以表示我们验证了这一密钥的正确性。

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即可查看提交的签名信息。

GPG 的基础使用:交换公钥

可以看到我们成功识别到了 GitHub 的提交的签名信息。

本作品采用《CC 协议》,转载必须注明作者和本文链接
sunxyw
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!