PGP密钥的生成和管理

发布于 2020-12-06  10674 次阅读


在互联网中,确认对方身份和加密数据是两种很常见的并且也很重要的事情。在实际使用上,通常使用非对称加密来进行认证和加密操作。一般使用时,最常用的就是使用PKI(Public key infrastructure)来进行。但是PKI十分依赖顶级认证机构,对于个人用户来说比较不便。不过好在现在有另一套体系填补了去中心化的证书体系的空白,即PGP(Pretty Good Privacy)

PGP不依赖中心化的认证机构,而是由用户本身来设定对其他人的信任级别,对于互不相识的两人,则可以由双方都认识的中间人来进行认证。这种方式类似于现实当中两人有着共同的朋友,于是由这位共同的朋友来介绍两人互相认识的情况类似。

实际上,PGP并没有使用技术手段来确认用户身份,大多数情况下,确认身份是通过两人线下见面来进行的。这种麻烦的地方也是PGP没有广为流行的原因之一。

现在,PGP已经被IETF采纳为标准,并且被命名为OpenPGP

准备

首先应该安装对应操作系统的OpenPGP软件。通常来说,使用最多的OpenPGP软件是GNU的GnuPG,简称gpg,这里就直接使用GPG来进行配置。在unix-like系统上,可以使用系统的包管理器来安装;在Windows系统上,可以使用Gpg4win来安装gpg软件;而在macOS上,则可以使用GPGTools

安装完成后,打开终端,输入gpg --version,若返回版本信息和简介,则说明安装成功。

为了保险起见,在进行下一步之前,通常建议先断开网络,再生成密钥。

生成密钥

在终端中输入gpg --full-ken-gey来开始生成密钥,执行之后会要求选择密钥所使用的加密算法。

请选择您要使用的密钥类型:
   (1) RSA 和 RSA (默认)
   (2) DSA 和 Elgamal
   (3) DSA(仅用于签名)
   (4) RSA(仅用于签名)
   (14) Existing key from card
您的选择是?

RSA算法由于通用型最好,所以这里选择RSA算法,输入1并按下回车,之后会要求输入密钥的长度,为了增加安全性,建议输入允许的最大值。

接下来需要设置密钥的有效期。不建议设置有效期为永久,通常设置1年到2年左右即可。这里输入1y就是有效期1年。输入之后会询问过期日期是否正确,检查无误后输入y即可。

然后,需要输入密钥对应的身份信息,例如姓名和电子邮件地址。输入完成后会询问输入信息是否正确,无误的话,输入o确认。之后会要求设置密钥的密码,输入两次后确认,确认之后就会开始生成密钥,此时可以随机敲打键盘或者晃动鼠标来为密钥增加强度。

在生成成功后,会显示生成密钥的一些信息,例如名称、算法、用途、有效期等。

生成子密钥

在上面生成密钥的时候,默认会生成两个密钥,分别为主密钥和加密子密钥。因为在使用时,如果只使用主密钥,一旦泄露,就只能吊销,非常麻烦。所以在使用时,都会利用主密钥来生成子密钥来代替使用,而主密钥则只在生成子密钥、续期以及吊销的时候才会使用,而在不用的时候,应将其导出到U盘之类的外置设备中妥善保管,并且在删除电脑中的主密钥避免泄漏。

在生成子密钥时,需要使用--edit-key选项进入编辑模式,输入以下命令:

gpg --edit-key 密钥名

其中密钥名为生成时显示的长字符串,在不引起歧义的情况下,也可以使用之前输入的姓名来替代。

进入编辑模式之后,输入命令addkey来增加子密钥,如果出现的选项菜单里没有自定义用途或者set your own capabilities的话,需要退出编辑模式,然后将进入编辑模式的命令前加入--expert参数,如下:

gpg --expert --edit-ket 密钥名

由于之前生成密钥时已经自动生成了加密子密钥,这里就不在重新生成,选择选项RSA (仅用于签名)RSA (sign only)来生成签名子密钥。选择后输入密钥长度,这里仍然建议输入最大值。在之后输入密钥有效期,子密钥的有效期可以选择与主密钥一样长,也可以适当缩短。输入后会显示子密钥的过期时间,确认并进入下一步后会询问是否真的创建子密钥,再次确认后会要求输入主密钥密码,输入密码并确认后开始生成子密钥,此时仍然可以随机敲击键盘或者晃动鼠标来增加密钥强度。

如果有需要的话,签名子密钥生成后可以继续生成认证子密钥,认证子密钥一般多用于SSH认证。

由于生成子密钥时没有直接提供生成认证子密钥选项,所以要通过选择用途的方式来选择认证功能。输入addkey命令,然后选择RSA (自定义用途)或者RSA (set your own capabilities),选择后出现功能选择菜单。默认选择中已经选择了签名功能和加密功能,首先输入A来开启认证功能,回车后再分别输入S回车和E回车来取消选择签名和加密功能。选择完成后输入Q,然后回车结束功能选择。选择结束后,进入输入密钥长度的设定,之后的流程与之前生成签名子密钥时相同。

生成吊销证书

如果主密钥丢失或者泄漏,使用吊销证书可以让主密钥失效,避免被其他人利用。

默认情况下,在生成主密钥时会同时生成吊销证书,位置在~/.gnupg/openpgp-revocs.d/目录下。如果没有同时生成吊销证书或者私钥还可以访问的话,可以重新生成吊销证书。

使用以下命令来生成吊销证书:

gpg --generate-revocation 密钥名

输入y确认后选择吊销原因,原因选择完毕后可以输入描述,写完后按两次回车。之后输入y确认并输入私钥密码。

生成完成后,保存生成的吊销证书并妥善保管。

导出密钥

为了安全起见,主密钥和吊销证书应离线储存,使用以下命令导出所有密钥:

gpg --armor --output 导出文件 --export-secret-keys 密钥名

其中,导出文件是导出的密钥的文件名和位置,--armor参数是为了以ASCII格式导出,删除参数就会以二进制格式导出。

导出完毕后最好对子密钥也进行导出备份,如果需要在其他设备也使用的话,可以使用备份的子密钥来导入。输入下面的命令:

gpg --armor --output 导出文件 --export-secret-subkeys 密钥名

导出完成后,将吊销证书和第一次导出的带有主密钥的文件放在U盘中备份并妥善保存,子密钥则可以放在另一个U盘中进行备份。

删除密钥

主密钥已备份保存后,在正常使用中通常只用子密钥即可,所以主密钥应清除掉来避免泄漏,使用下列命令删除密钥:

gpg --delete-secret-keys 密钥名

执行后会对每一个私钥都询问是否删除,全部确认后即删除完成。

删除密钥后,之前生成的吊销证书也应在备份后从设备中删除。

导入密钥

删除密钥后,需要重新导入子密钥才能使用。找到之前备份的子密钥文件,,并执行以下命令

gpg --import 备份文件

执行后输入私钥密码来进行导入,导入成功后会返回导入的密钥数量。在导入后,使用gpg --list-secret-keys来查看,如果未导入主密钥,则会在主密钥的sec后面显示#符号,如果导入了的密钥包括主密钥则不会显示#符号。也可以进入编辑模式来查看,如果导入的是子密钥,则会显示私密子密钥可用;如果导入的密钥包括主密钥则会显示私钥可用。

如果导入后密钥的信任度没有数据的话,需要重新设置密钥的信任度。使用下列命令进入密钥编辑模式:

gpg --edit-key 密钥名

进入编辑模式后,输入命令trust,此时会出现信任度选择菜单,由于这个密钥就是自己的,所以选择绝对相信即可。完成后退出编辑模式。

发布公钥

在使用中,需要将公钥发布给公钥服务器来方便其他人验证使用,使用以下命令来将公钥上传到公钥服务器进行发布。

gpg --send-keys 密钥名

更新:公钥服务器在使用时会有诸多问题,现已不推荐使用公钥服务器来发布公钥。

或者也可以直接导出公钥给其他人使用:

gpg --output 公钥文件 --armor --export 密钥名

续期密钥

如果生成密钥时设置了有效期,那么在过期的时候就需要修改有效期来使其继续生效。

续期需要导入主密钥,在主密钥导入之后输入以下命令进入密钥编辑状态:

gpg --edit-key 密钥名

若要续期主密钥,则直接输入expire,如果要续期子密钥,则输入key 子密钥序号来选择子密钥。其中,子密钥序号为显示的密钥列表中去除最上面的主密钥的顺序,输入之后,在子密钥前面的ssb后面会显示一个*来表示被选中。选中后同样输入expire。如果选择了多个子密钥,则会询问是否更变多个子密钥的过期时间,确认后,输入有效期限并确认即可修改子密钥的过期时间。

吊销子密钥

如果子密钥被泄露的话,可以只吊销子密钥。这也是为什么要区分主密钥和子密钥的原因,因为一旦主密钥因为泄露被吊销,那么就只能生成全新的主密钥来使用,此前积累的来自其他人的认证也会全部失效。而使用子密钥并离线存放主密钥的话,主密钥泄露的风险会非常低,也就避免了全部密钥失效的情况。

在撤销之前,首先要导入主密钥,导入之后进入密钥编辑模式,然后输入key 子密钥序号来选择要吊销子密钥。选择后输入命令revkey,然后选择吊销的原因和描述,确认后输入私钥密码。确认后在密钥列表中就可以看到被吊销的密钥上方提示下列密钥被吊销,有效期也会变成吊销日期。

吊销之后还需要公布吊销信息,如果之前公钥已被上传至公钥服务器的话,使用以下命令可以在服务器上重新上传公钥来发布吊销信息:

gpg --keyserver 服务器地址 --send-keys 密钥名

也可以直接输出并放在网站或其他地方上:

gpg --export -a > 输出文件

发布之后其他人更新公钥即可收到吊销信息。

由于吊销前进行加密的内容仍需被吊销的密钥进行解密,所以被吊销的密钥也不应丢弃。此外,若将PGP用于SSH认证,由于SSH的私钥认证并不通过主密钥来认证,所以即使吊销私钥,也可以进行访问,所以吊销后应当修改使用该密钥的SSH服务端来避免非法访问。

届ける言葉を今は育ててる
最后更新于 2020-12-06