13.6 GPG签名
当从中央仓库下载第三方构件的时候,你可能会想要验证这些文件的合法性,例如它们是由开源项目官方发布的,并且没有被篡改过。同样地,当发布自己项目给客户使用的时候,你的客户也会想要验证这些文件是否是由你的项目组发布的,且没有被恶意篡改过。PGP(Pretty Good Privacy)就是这样一个用来帮助提高安全性的技术。PGP最常用来给电子邮件进行加密、解密以及提供签名,以提高电子邮件交流的安全性。本节介绍如何使用PGP技术为发布的Maven构件签名,为项目增强安全性。
13.6.1 GPG及其基本使用
GnuPG(简称GPG,来自http://www.gnupg.org/)是PGP标准的一个免费实现,无论是类UNIX平台还是Windows平台,都可以使用它。GPG能够帮助我们为文件生成签名、管理密钥以及验证签名等。
首先,访问http://www.gnupg.org/download/并下载对应自己平台的GPG分发包,按照官方的文档将GPG安装完毕,运行如下命令检查安装:
juven@juven-ubuntu:~$gpg—version
gpg(GnuPG)1.4.9Copyright(C)2008 Free Software Foundation,Inc.
License GPLv3+:GNU GPL version 3 or later
……
在使用GPG之前,先得为自己准备一个密钥对,即一个私钥和一个公钥。之后才可以使用私钥对文件进行签名,并且将公钥分发到公钥服务器供其他用户下载,用户可以使用公钥对签名进行验证。
使用如下命令生成密钥对:
juven@juven-ubuntu:~$gpg—gen-key
GPG会问你密钥的类型、大小和有效时间,通常使用默认的值即可。GPG还会要求你输入自己的名称、电子邮件地址和对密钥的注释,这些内容会被包含在公钥中并被你的用户看到,因此务必正确填写。最后,还可以提供一个密码来保护密钥,这不是强制性的,但通常最好提供以防止别人得到你的密钥后恶意使用。你将来需要使用私钥和密码为文件提供签名,因此一定要认证保护它们。
现在已经有了密钥对,就可以在命令行中查看它们(其他导入到本地机器的密钥也会被显示),如下面的命令可用来列出所有公钥:
juven@ juven-ubuntu:~ $ gpg —list-keys
/home/juven/.gnupg/pubring.gpg
------------------------------
pub1024D/C6EED57A2010 -01 -13
uidJuven Xu (Juven Xu works at Sonatype) juven@ sonatype.com
sub2048g/D704745C 2010 -01 -13
这里的/home/juven/.gnupg/pubring.gpg表示公钥存储的位置。以pub开头的一行显示公钥的长度(1024D)、ID(C6EED57A)以及创建日期(2010-01-13)。下一行显示了公钥的UID,也就是一个由名称、注释和邮件地址组成的字符串。最后一行显示的子钥不用关心。
类似地,下面的命令用来列出本机私钥:
juven@ juven-ubuntu:~ $ gpg —list - secret-keys
/home/juven/.gnupg/secring.gpg
------------------------------
sec1024D/C6EED57A2010 -01 -13
uidJuven Xu (Juven Xu works at Sonatype)
ssb2048g/D704745C2010 -01 -13
对GPG的公私钥有了基本的了解之后,就可以使用如下命令为任意文件创建一个ASCII格式的签名:
juven@juven-ubuntu:~$gpg-ab temp.java
这里的-a选项告诉GPG创建ASCII格式的输出,而-b选项则告诉GPG创建一个独立的签名文件。如果你的私钥拥有密码,这个时候就需要输入密码。如果私钥没有密码,那么只要他人获得了你的私钥,就能够以你的名义对任何内容进行签名,这是非常危险的。
在该例中,GPG会创建一个名为temp.java.asc的签名文件,这时就可以将这个后缀名为.asc的签名文件连同原始文件一起分发给你的用户。如果你的用户已经导入了你的公钥,就可以运行如下命令验证原始文件:
$gpg—verify temp.java.asc
为了能让你的用户获取公钥并验证你分发的文件,需要将公钥分发到公钥服务器中。例如,hkp://pgp.mit.edu是美国麻省理工学院提供的公钥服务器,运行如下命令可将公钥分发到该服务器中:
$gpg—keyserver hkp://pgp.mit.edu—send-keys C6EED57A
这里的—keyserver选项用来指定分发服务器的地址,—send-keys用来指定想要分发公钥的ID。你可以罗列本地公钥来查看它们的ID。需要注意的是,公钥会在各个公钥服务器中被同步,因此你不需要重复地往各个服务器分发同一公钥。
现在,你的用户可以将服务器上的公钥导入到本地机器:
$gpg—keyserver hkp://pgp.mit.edu—recv-keys C6EED57A
上述就是一个基本的签名、分发并验证的流程,在使用Maven发布项目的时候,可以使用GPG为发布文件提供签名。现在读者应该已经知道如何手工完成这一步骤了,下面介绍如何使用Maven GPG Plugin自动化签名这一步骤。