2023 GPG 使用指南

GPG 可以为 Gitee/GitHub/Gitea 增加一个小小的绿标。下面写个简单的备忘。

如果想入门 GPG ,可视化是很不错的选择。Windows 端的 Gpg4win ,安卓的 openkeychain 都是不错的选择。在可视化的界面下帮助下,如 Kleopatra(Gpg4win其中组件之一) ,openkeychain 。密钥的生成,导出,调整有效时间,撤销都是很简单的事情。下面介绍一下基本概念

不过想在 git 上使用,也需要大概的掌握一些命令。比如导入密钥,删除密钥,密码的输入等等。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
gpg -k
gpg --list-keys
gpg --list-secret-keys
gpg --full-generate-key --expert
gpg --import secret.file --edit-key [UserID]
gpg --expert --edit-key [UserID]
gpg --export --armor
gpg --export
gpg -a -o public-file.key --export [UserID]
gpg -a -o private-file.key --export-secret-keys [UserID]
gpg -a --export-secret-subkeys [UserID] > subkeys
gpg --import somefile
gpg --delete-secret-keys [keyId]
gpg --delete-keys [keyId]
gpg --list-secret-keys --keyid-format=long

GPG 的密钥实际上是一组密钥,由第一个密钥,也就是主密钥,生成子密钥。正常导出分享的公钥,实际上是这个密钥组的公钥。因此可以通过更改密钥组公钥,来使子密钥生效,过期,撤销弃用。主密钥则可以通过生成撤销证书来撤销,需要注意的是,这个撤销证书最好在生成主密钥后就生成妥善保存,避免忘记。

密钥组中密钥可以拥有的功能:

  1. 认证 [C]
  2. 签名 [S]
  3. 身份验证 [A]
  4. 加密 [E]

其中主密钥必须有 认证 [C] 能力,且这项能力只能属于主密钥。子密钥可以有一个或多个能力,部分算法并不支持某些功能,在生成子密钥的时候就可以看到。

生成密钥之后,需要保存主密钥到一个安全的地方。导出公钥分发给朋友或上传服务器,导出单个含有 签名 [S] 的私钥用于给 git commit 签名等。

GPG 设计使用 hkp 协议的服务器公开和存储大家的公钥,如 SKS 。SKS 作为全球密钥同步网络,其中一个服务器之后会被同步到其他服务器,上面的任何内容都不会被删除,只能被撤销。这就增加了一定的不可控性。设计为不可删除的目的在于建立一个可信的网络,但是不可删除的特性也带来了许多的问题,比如滥用–被用来存储文件和非法文件,隐私问题–任何人可以通过该网络查到曾经使用的邮箱,或者不小心泄露的姓名拼音。

然而,SKS 并非不可替代的。比如 https://keys.openpgp.org/about ,真正上传到该服务器并公开密钥之前,需要验证邮箱。并且可以通过邮箱登录进入一个管理界面来删除之前发布的公钥。

再比如可以通过 Github , Gitee 等存储密钥。比如 https://gitee.com/kkbt.gpg , 上传公钥后,用户名加上 .gpg 即可访问获取。甚至 Gitee 并不要求使用命令行验证,只需要再输入一次密码即可添加。此外 keybase.io 也是支持公开密钥的。

此外还有 WKD ,在邮箱支持的情况下,知道邮箱就可以使用 Web Key Directory 协议获取公钥。如 0@ftls.xyz 的公钥可以从 https://ftls.xyz/.well-known/openpgpkey/hu/s3cj9timbzrn3hjyu8ehfiykzgkqooec 获取。进阶可选配置为,配置一个域名解析 openpgpkey.ftls.xyz 300 IN CNAME wkd.keys.openpgp.org 。可以下面的验证网址中输入 0@ftls.xyz 查看效果。如果没有域名和域名邮箱,使用的方法是找一个支持 WKD 的邮箱服务。计算方法可见 2024-02-15-wkd

教程 https://docs.keyoxide.org/advanced/web-key-directory/
验证 https://metacode.biz/openpgp/web-key-directory

在以上公开公钥的方法中,SKS 不可删除,其他在一定程度上均可控。如 openkeychain 默认使用 https://keys.openpgp.org/about ,换句话说,可以通过简单的操作就可以上传公钥,并在需要时,通过 Web 管理,删除之前的公钥。

上传到不可删除的服务器中,请保管好主密钥私钥,撤销证书,并确认隐私泄露风险(如邮箱,真实姓名拼音)

导入含有 签名 [S] 的私钥。

1
2
3
4
5
6
# Windows 需要设置
git config --global gpg.program "c:/Program Files (x86)/GnuPG/bin/gpg.exe"
# 
git config --global user.signingkey [keyId]
git config --global commit.gpgsign true # 自动签名 无需 -S
git commit -S -m "init"

需要注意的是,Gitee 需要在设置中配置。配置完成后,如 https://gitee.com/kkbt.gpg 可以访问到公钥。Github,Gitea 平台需要用给的提示,签名一次才能配置成功。

如果出错,不能弹出密码输入框。可输入以下命令

1
2
3
4
#bash
export GPG_TTY=$(tty)
#fish
set -x GPG_TTY (tty) 

或者使用 VSCode 插件 GPG Indicator ,通过机密存储区中的关联密码自动解锁。

导出签名和加密功能的私钥,用于收发邮件。

  1. 发送时。使用自己的签名密钥私钥,对发送的邮件签名,方便接受者验证邮件确实由你发出。并使用对方公钥加密邮件内容。
  2. 接收时。验证确实由对方发出,然后使用自己的私钥,解密加密邮件内容。

建议找一个支持的邮箱客户端自动处理这些事情。可在下面的客户端部分找找。

https://www.openkeychain.org/ 这个安卓密钥管理软件,列出了几个可用的客户端,其中有几个是用于邮件收发的。默认会把消息作为附件发送,在 Windows 平台,可以解密后,修改后缀为 .eml 即可查看。安卓看直接使用 openkeychain 打开并查看邮件附件。

https://keys.openpgp.org/about 也列出了几个各种平台的。可以找找看

AppDescriptionInstallOpen Source
K-9 MailBest open source email client for AndroidPlay, F-DroidGitHub
ConversationsJabber/XMPP client with OpenPGP supportPlay, F-DroidGitHub
Password StorePassword manager compatible with “pass”Play, F-DroidGitHub
OversecTransparently encrypts and decrypts any text in any app.Play
Mail.deMail.de email clientPlay
PGPClipperPGPClipper integrates with the clipboard to decrypt PGP messagesF-DroidGitHub
andOTPOTP generator with backups in OpenPGP formatPlay, F-DroidGitHub
oandbackupBackup apps encrypted via OpenPGPF-DroidGitHub
PGPAuthSend OpenPGP-signed requests to a serverPlay, F-DroidGitHub
PhotoPGPTake photos of sensitive, private, or confidential informationPlay
FairEmailFully featured, open source, privacy oriented email app for AndroidPlay, F-DroidGitHub

GPG 导入我的公钥

1
curl https://gitee.com/kkbt.gpg | gpg --import

公钥服务器上面,我的GPG 公钥
GPG 指纹 A7B3 478E 9A38 DAC3 C090 6E2A 6B9F B325 8250 B3A4
可在 GPG 公钥服务器搜索 a7b3478e9a38dac3c0906e2a6b9fb3258250b3a40@ftls.xyz 找到该公钥,也可以在 https://gitee.com/kkbt.gpg 获取公钥。