0x00 GPG 简介
GnuPG (GNU Privacy Guard) 即 GPG,是一个使用 RSA 算法的密码学软件,用于加密、签名通信内容及管理非对称密码学的密钥。
GPG 在公网有提供自己的加解密服务,要使用 GPG 的服务,一般只需要 4 步:
- 本地生成 GPG 密钥对
- 上传公钥到 GPG 的密钥服务器
- 用私钥加密文件,然后发送给别人
- 别人在 GPG 的密钥服务器中找到对应的公钥解密、并验证其中的用户信息
0x10 GPG 安装
Mac 上可直接使用命令 brew install -v gpg
安装。
Windows 到 GPG 官网下载安装包: https://www.gnupg.org/download/
0x20 生成 GPG 密钥对
在 Mac 下,首先执行命令 export GPG_TTY=$(tty)
确保当前终端能够弹出交互式会话(用于输入密码)。
Windows 不需要执行命令
export GPG_TTY=$(tty)
然后在终端执行命令 gpg --generate-key
,按提示依次填写密钥信息:
此时会要求输入 2 次密钥对的保护密码:
保护密码切勿丢失,否则这套密钥没法使用
完成后会生成密钥对,并返回相关的密钥信息。
其中公钥会直接返回,如下图的红框部分 :
0x30 上传公钥
得到公钥后,将其上传到 GPG 密钥服务器即可。
GPG 目前在公网提供了 3 个服务, sonatype 会从这 3 个服务中查找公钥:
- http://keys.openpgp.org:11371
- http://keyserver.ubuntu.com:11371
- http://pool.sks-keyservers.net:11371 (已失效)
任选一个服务上传刚刚得到的公钥即可,命令如下:
gpg --keyserver ${GPG_SERVICE} --send-keys ${GPG_PUBLIC_KEY}
例如:
gpg --keyserver http://keys.openpgp.org:11371 --send-keys 4216FBA3E543D5523BF2837B7932161FD7D571BD
0x40 查询本地 GPG 的公钥/私钥
若之后想查询某一套 GPG 密钥对,可以执行命令 gpg --list-secret-keys --keyid-format LONG
查看已经生成的所有密钥,如这里是前面生成的一组密钥:
/Users/exp/.gnupg/pubring.kbx
-----------------------------
sec ed25519/7932161FD7D571BD 2022-10-04 [SC] [有效至:2024-10-03]
4216FBA3E543D5523BF2837B7932161FD7D571BD
uid [ 绝对 ] EXP <exp.lqb@foxmail.com>
ssb cv25519/04093D97AE54681E 2022-10-04 [E] [有效至:2024-10-03]
其中 4216FBA3E543D5523BF2837B7932161FD7D571BD
就是公钥。
而 7932161FD7D571BD
是这组密钥的特征串,可以用来执行以下命令查询私钥:
gpg --armo --export-secret-keys 7932161FD7D571BD
输入生成 GPG 时设置的密钥后,即可得到私钥:
-----BEGIN PGP PRIVATE KEY BLOCK-----
lIYEYzvgoxYJKwYBBAHaRw8BAQdAyB6uNFc9yJuoXPxhKMt56DIvlPsCy+Ht9KqB
ePF2lB3+BwMCJ3MSxtOf+hHz+KC2y+L80eV1IoQy/zQsnItl3P0n0FZtAb8TFGGJ
MY+y9SRdkMkPDC+Af9Xm52DMUx5Gp/IJr2TfT+DWNl5R+roeAYZw8rQZRVhQIDxl
eHAubHFiQGZveG1haWwuY29tPoiZBBMWCgBBFiEEQhb7o+VD1VI78oN7eTIWH9fV
cb0FAmM74KMCGwMFCQPCZwAFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQ
eTIWH9fVcb2ljQD5ARBLbYMJmr1Jx3xoZ2E3XfpqM/dz/7IpTQKKU69aRxUBAIjt
Eg4buxyApu36pSdnOo5ehC7Cvn0YVaPBwMwekokDnIsEYzvgoxIKKwYBBAGXVQEF
AQEHQOlSka4uyLK+t+nqPQXyFqrSSO7rHnUBJURvm/KIITY1AwEIB/4HAwJul83f
2pK0tfNOw+CUzVlEBWRMkdO4pa5uohqv45XJek1jWx0ZYDd/4YL7xvac8oRiywLz
OePTn6VyNTIzhpR4quaxgjIt52FIM3/hZM3AiH4EGBYKACYWIQRCFvuj5UPVUjvy
g3t5MhYf19VxvQUCYzvgowIbDAUJA8JnAAAKCRB5MhYf19VxvRdIAQDsufeNhZwL
7TdeSVYr+NihwHr4C0wnWjUtby5ATuXs9QD/W56PLA9s5cH3ITSW5YjGi5690ruc
7qpRt6zficSsDws=
=QXK8
-----END PGP PRIVATE KEY BLOCK-----
接下来你就可以用私钥为所欲为啦!
0xF0 Q & A
0xF1 上传公钥时报错 Certificate expired
刚刚生成的公钥,上传到密钥服务器时报错证书过期?
gpg: sending key 4576C52CE802E8D6 to http://keys.openpgp.org:11371
gpg: keyserver send failed: Certificate expired
gpg: keyserver send failed: Certificate expired
可参考这篇文章《Unable to distribute a GPG public key when never expires, because it has expired》。
简单概括就是两个可能的原因:
- 本地系统时间没校准
- 安装的 GnuPG 版本过低
解决方案也很简单:
- 校准本地系统时间
- 升级 GnuPG 版本
- 若以上方法都不行,不妨换个密钥服务器上传试试
0xF2 查询私钥时报错 No such file or directory
Mac 环境使用 0x40 的方法查询本地私钥时报错
error receiving key from agent: No such file or directory - 已跳过
gpg: 警告:没有导出任何东西
原因是因为,默认情况下 GPG 的密码是需要通过交互式窗口输入的,但是当前终端的默认配置不支持窗口交互,导致报错。
解决方法也很简单:执行命令 export GPG_TTY=$(tty)
后,再重新查看即可。
为了一劳永逸,可以把此命令写在环境变量文件
~/.bash
中。