# 2023 GPG 使用指南 GPG 可以为 Gitee/GitHub/Gitea 增加一个小小的绿标。下面写个简单的备忘。 如果想入门 GPG ,可视化是很不错的选择。Windows 端的 Gpg4win ,安卓的 openkeychain 都是不错的选择。在可视化的界面下帮助下,如 Kleopatra(Gpg4win其中组件之一) ,openkeychain 。密钥的生成,导出,调整有效时间,撤销都是很简单的事情。下面介绍一下基本概念 不过想在 git 上使用,也需要大概的掌握一些命令。比如导入密钥,删除密钥,密码的输入等等。 ```bash 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](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](/posts/2024-02-15-wkd/) ![Screenshot_20230718_212212](https://cdn.ftls.xyz/images/2023/07/Screenshot_20230718_212212.jpg) 教程 https://docs.keyoxide.org/advanced/web-key-directory/ 验证 https://metacode.biz/openpgp/web-key-directory 在以上公开公钥的方法中,SKS 不可删除,其他在一定程度上均可控。如 openkeychain 默认使用 [https://keys.openpgp.org/about](https://keys.openpgp.org/about) ,换句话说,可以通过简单的操作就可以上传公钥,并在需要时,通过 Web 管理,删除之前的公钥。 上传到不可删除的服务器中,请保管好主密钥私钥,撤销证书,并确认隐私泄露风险(如邮箱,真实姓名拼音) ### GIT 签名 导入含有 签名 [S] 的私钥。 ```bash # 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 平台需要用给的提示,签名一次才能配置成功。 如果出错,不能弹出密码输入框。可输入以下命令 ```bash #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](https://keys.openpgp.org/about) 也列出了几个各种平台的。可以找找看 | App | Description | Install | Open Source | | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | [K-9 Mail](https://k9mail.github.io/ "https://k9mail.github.io/") | Best open source email client for Android | Play, F-Droid | [GitHub](https://github.com/k9mail/k-9 "https://github.com/k9mail/k-9") | | [Conversations](https://conversations.im/ "https://conversations.im/") | Jabber/XMPP client with OpenPGP support | Play, F-Droid | [GitHub](https://github.com/iNPUTmice/Conversations "https://github.com/iNPUTmice/Conversations") | | [Password Store](https://play.google.com/store/apps/details?id=dev.msfjarvis.aps "https://play.google.com/store/apps/details?id=dev.msfjarvis.aps") | [Password manager compatible with “pass”](http://www.passwordstore.org/ "http://www.passwordstore.org/") | Play, F-Droid | [GitHub](https://github.com/android-password-store/Android-Password-Store "https://github.com/android-password-store/Android-Password-Store") | | [Oversec](http://www.oversec.io/ "http://www.oversec.io/") | Transparently encrypts and decrypts any text in any app. | [Play](https://play.google.com/store/apps/details?id=io.oversec.one "https://play.google.com/store/apps/details?id=io.oversec.one") | | | [Mail.de](https://mail.de/mobile-apps/ "https://mail.de/mobile-apps/") | Mail.de email client | [Play](https://play.google.com/store/apps/details?id=de.mail.android.mailapp "https://play.google.com/store/apps/details?id=de.mail.android.mailapp") | | | [PGPClipper](https://f-droid.org/app/moe.minori.pgpclipper "https://f-droid.org/app/moe.minori.pgpclipper") | PGPClipper integrates with the clipboard to decrypt PGP messages | [F-Droid](https://f-droid.org/app/moe.minori.pgpclipper "https://f-droid.org/app/moe.minori.pgpclipper") | [GitHub](https://github.com/Mnkai/PGPClipper "https://github.com/Mnkai/PGPClipper") | | [andOTP](https://play.google.com/store/apps/details?id=org.shadowice.flocke.andotp "https://play.google.com/store/apps/details?id=org.shadowice.flocke.andotp") | OTP generator with backups in OpenPGP format | Play, F-Droid | [GitHub](https://github.com/andOTP/andOTP "https://github.com/andOTP/andOTP") | | [oandbackup](https://f-droid.org/app/dk.jens.backup "https://f-droid.org/app/dk.jens.backup") | Backup apps encrypted via OpenPGP | [F-Droid](https://f-droid.org/app/dk.jens.backup "https://f-droid.org/app/dk.jens.backup") | [GitHub](https://github.com/jensstein/oandbackup "https://github.com/jensstein/oandbackup") | | [PGPAuth](https://play.google.com/store/apps/details?id=org.lf_net.pgpunlocker "https://play.google.com/store/apps/details?id=org.lf_net.pgpunlocker") | Send OpenPGP-signed requests to a server | Play, F-Droid | [GitHub](https://github.com/PGPAuth/PGPAuth_Android "https://github.com/PGPAuth/PGPAuth_Android") | | [PhotoPGP](http://photopgp.com/site/ "http://photopgp.com/site/") | Take photos of sensitive, private, or confidential information | [Play](https://play.google.com/store/apps/details?id=com.photopgp.full "https://play.google.com/store/apps/details?id=com.photopgp.full") | | | [FairEmail](https://email.faircode.eu/ "https://email.faircode.eu/") | Fully featured, open source, privacy oriented email app for Android | Play, F-Droid | [GitHub](https://github.com/M66B/FairEmail "https://github.com/M66B/FairEmail") | ### 联络 GPG 导入我的公钥 ```bash curl https://gitee.com/kkbt.gpg | gpg --import ``` 公钥服务器上面,[我的GPG 公钥](https://keys.openpgp.org/vks/v1/by-fingerprint/A7B3478E9A38DAC3C0906E2A6B9FB3258250B3A4) GPG 指纹 `A7B3 478E 9A38 DAC3 C090 6E2A 6B9F B325 8250 B3A4` 可在 GPG 公钥服务器搜索 `a7b3478e9a38dac3c0906e2a6b9fb3258250b3a4` 或 `0@ftls.xyz` 找到该公钥,也可以在 [https://gitee.com/kkbt.gpg](https://gitee.com/kkbt.gpg) 获取公钥。