GnuPG 环境安装与配置


0x00 GPG 简介

GnuPG (GNU Privacy Guard) 即 GPG,是一个使用 RSA 算法的密码学软件,用于加密、签名通信内容及管理非对称密码学的密钥。

GPG 在公网有提供自己的加解密服务,要使用 GPG 的服务,一般只需要 4 步:

  1. 本地生成 GPG 密钥对
  2. 上传公钥到 GPG 的密钥服务器
  3. 用私钥加密文件,然后发送给别人
  4. 别人在 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 个服务中查找公钥:

任选一个服务上传刚刚得到的公钥即可,命令如下:

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》。

简单概括就是两个可能的原因:

  1. 本地系统时间没校准
  2. 安装的 GnuPG 版本过低

解决方案也很简单:

  1. 校准本地系统时间
  2. 升级 GnuPG 版本
  3. 若以上方法都不行,不妨换个密钥服务器上传试试

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 中。


文章作者: EXP
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 EXP !
 上一篇
发布 JAR 到 Maven 中央仓库全流程指引 发布 JAR 到 Maven 中央仓库全流程指引
0x00 前言Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了包含了绝大多数流行的开源Java构件、以及源码、作者信息、SCM、信息、许可证信息等。 一般来说,简单的 Java 项目依赖的构件都可以在这里下载到。 国内大部分
2022-10-04
下一篇 
如何在 “咩了个咩” 的魔爪中解救女朋友 如何在 “咩了个咩” 的魔爪中解救女朋友
女朋友被恶魔游戏 “咩了个咩” 破防胁持人身自由,为了解救她,作者用魔法打败魔法,记录与恶魔游戏的对抗过程,抛砖引玉讲述了中间人攻击的实际应用 —— 网络安全任重而道远,要引以为鉴
2022-09-18
  目录