openPGP 常见操作辨析

这篇文章不会介绍GPG的各种命令,只是对密钥管理的一些细节进行介绍,可能需要读者具有一定的公钥加密常识。

引子

首先说一下gpg中对公钥用途的定义。常见的有三种,SCE。

C(certify),认证,就是对别人的公钥进行签名。
S(sign),签名,这个是常见的对文件对消息的签名。
E(encrypt),对文件对消息的加密。
其中最重要的是certify,它是一个公钥必须要有的功能。
数字签名本质就是将一些信息和一个公钥进行绑定,GPG中的大部分操作都是通过RFC中定义的不同种类签名实现。

对他人密钥的操作

openPGP中对他人的操作有两类,sign 和 trust。

sign

sign 就是对他人公钥的有效性进行确定, 它的操作精度是UID ,如果别人的公钥含有多个用户名,那么可能就需要进行多次签名。

trust

Trust, 就是不仅认为某个公钥是真实的,并且认为它很负责任,它签名的公钥也具有真实性。根据信任程度分为不同等级。作用就是当你从公钥服务器中导入一个陌生公钥时,如果某个你trust的公钥对该公钥进行签名,那么你就没有必要手动sign了。

对自己密钥的操作

有很多,如子钥、用户名、过期时间、吊销等等。

子钥

如果你在使用GPG产生公钥时,一切都是默认选项,那么你得到的其实是两个密钥对。一个称为Primary Key, 另一个Subkey。主钥具有SC,子钥具有E。
从本质上讲,这两个密钥对是独立的。它们的关系是通过两种特定的签名实现的。这两个密钥对互相签名,主钥签名认领子钥,子钥签名认定主钥,由此人为分出主、子密钥。
这个签名过程在GPG中是自动完成的,子钥私钥的密码默认与主钥一致,但是可以修改。
使用子密钥更多是出于安全性的考量,更具体的解释可以参考Debian Wiki

用户名

一个主钥上可以绑定多个用户名,分别用于不同的用途。这一点和上文签名精度是UID对应。

吊销

吊销就是宣布失效了,对主钥精度达到UID,对子钥就是整个子钥了(用户名是绑定在主钥上了)。既可以吊销自己的主钥子钥,也可以吊销对他人主钥的签名。如果没有发布到公钥服务器上,那么直接删除是更好的选择。

过期时间

过期时间只是自己在证书中设定的一段信息而已,只要拥有私钥,可以随时更改。
因此,最好不要设置太长的过期时间了,假如公钥不使用了,即使发布吊销证书,它也依旧存活在公钥服务器上,实在是一种浪费
公钥一旦上传,便会在全球数千台服务器间同步,且永远保留,即使它已经过期、被吊销。在上传密钥服务器之前,请仔细考虑。详情请看这里

导出

导出的并不是公钥,而是证书。首先是你对自己颁发的证书,证书上有着你的真公钥,用户名,过期时间,或许还有子钥绑定等等信息,加上私钥对上述信息的签名。还有你对别人颁发的证书,上面有着你所签名的公钥信息和你对那些信息的签名。

最后

在关于openPGP的各种介绍中,公钥、公钥证书、签名、认证等各种名词经常被混用,这是openPGP难以理解的根源。比如,导出导入公钥,实际上导出导入的是公钥证书。这些混用需要仔细厘清。

如果依然觉得不解,可以参考一下RFC4880,重点是其中规定的各种签名和签名中的各种信息。