2010年5月23日星期日

用GnuPG数字签名验证下载软件

许多开源软件如openSuse等的发布都伴随着签名,用来验证下载软件来源的正确性以及数据的完整性。在非对称加密技术中,签名使用私钥,验证签名使用公钥,公钥可以从许多key server上获得(e.g., blackhole.pca.dfn.de)。

如何验证签名:
以openSuse为例,假设已经下载openSUSE-11.2-GNOME-LiveCD-i686.iso和openSUSE-11.2-GNOME-LiveCD-i686.iso.asc,其中openSUSE-11.2-GNOME-LiveCD-i686.iso.asc为数字签名文件,查看签名内容。

$vi openSUSE-11.2-GNOME-LiveCD-i686.iso.asc

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.7 (GNU/Linux)

iD8DBQBK+ASmqE7a6JyACsoRAr6xAJ9cXvbXPSCBH6hK3YhvzX+GjtiJ7QCf
ZFaSCTUY7FxpOm+WEfUTa92zD9Q=
=skuu
-----END PGP SIGNATURE-----

1、检查detached(分离的)签名
$ gpg openSUSE-11.2-GNOME-LiveCD-i686.iso.asc
gpg: 于 一 11/ 9 20:01:42 2009 CST 创建的签名,使用 DSA,钥匙号 9C800ACA
gpg: 无法检查签名:找不到公钥

从中看出创建签名时间为美国中部标准时间2009年9月11日20:01:42,使用DSA,key ID是9C800ACA。提示找不到公钥,无法验证签名,可以从key server上根据key ID获取相应的公钥,进行验证。常用的key server有pgpkeys.mit.edu
(which has a webinterface)、keyserver.ubuntu.com、pgp.mit.edu,这些公共的key server彼此都是互联的。

2、从key server上获取key ID为9C800ACA的公钥,并导入。
$gpg --keyserver pgpkeys.mit.edu --recv-key 9C800ACA
gpg: 下载密钥‘9C800ACA’,从 hkp 服务器 pgpkeys.mit.edu
gpg: 密钥 9C800ACA:公钥“SuSE Package Signing Key ”已导入
gpg: 没有找到任何绝对信任的密钥
gpg: 合计被处理的数量:1
gpg: 已导入:1

然而,仍然无法验证导入的公钥来自openSUSE Team,所以上面提示
gpg: 没有找到任何绝对信任的密钥

3、验证签名。
$ gpg openSUSE-11.2-GNOME-LiveCD-i686.iso.asc
gpg: 于 一 11/ 9 20:01:42 2009 CST 创建的签名,使用 DSA,钥匙号 9C800ACA
gpg: 完好的签名,来自于“SuSE Package Signing Key
gpg: 注意:这把密钥已经过期了!
主钥指纹: 79C1 79B2 E1C8 20C1 890F 9994 A84E DAE8 9C80 0ACA

签名完好,但是密钥过期。或者

$ gpg --verify openSUSE-11.2-GNOME-LiveCD-i686.iso.asc openSUSE-11.2-GNOME-LiveCD-i686.iso
gpg: 于 一 11/ 9 20:01:42 2009 CST 创建的签名,使用 DSA,钥匙号 9C800ACA
gpg: 完好的签名,来自于“SuSE Package Signing Key
gpg: 注意:这把密钥已经过期了!
主钥指纹: 79C1 79B2 E1C8 20C1 890F 9994 A84E DAE8 9C80 0ACA

或者
gpg --verify Downloads/openSUSE-11.2-GNOME-LiveCD-i686.iso.asc
gpg: 于 一 11/ 9 20:01:42 2009 CST 创建的签名,使用 DSA,钥匙号 9C800ACA
gpg: 完好的签名,来自于“SuSE Package Signing Key
gpg: 注意:这把密钥已经过期了!
主钥指纹: 79C1 79B2 E1C8 20C1 890F 9994 A84E DAE8 9C80 0ACA

这三种验证方式是等效的,第二种方式是完整的验证方式,其他方式只给出签名文件,根据文件名自动对应到原始文件。

$ gpg --list-keys
/Users/woody/.gnupg/pubring.gpg
-------------------------------
pub 1024D/87549EB3 2010-05-22
uid woody shi (guy)
sub 2048g/20C756EC 2010-05-22

pub 2048R/94DC9776 2008-03-23
uid wei shi
sub 2048R/714E0E5C 2008-03-23

pub 2048R/CA57AD7C 2004-12-06
uid PGP Global Directory Verification Key
uid [jpeg image of size 3400]

pub 1024D/1C91AC86 2003-08-04
uid Pythagoras Software (UK)
uid Pythagoras Software (UK)
uid Pythagoras Software (UK)
uid Pythagoras Software (UK)
sub 4096g/44936B97 2003-08-04

pub 1024D/9C800ACA 2000-10-19 [已过期:2010-05-05]
uid SuSE Package Signing Key

确实已经过期。

签名验证了数据的完整性,但是导入的公钥不受信任,需要另外验证key ID为9C800ACA的公钥来自openSUSE Team。攻击者可以制作公钥并上传到key server,然后用制作的密钥为一个恶意的release来签名,如果你验证这个恶意的release是没问题的。需要验证公钥的权威性。



标签: ,


评论: 发表评论

订阅 博文评论 [Atom]





<< 主页

This page is powered by Blogger. Isn't yours?

订阅 博文 [Atom]