Debian Secure APT简介

November 2nd, 2009 1 comment

简单说一下Debian APT体系中为了保证deb包的完整性和可信,建立的一套secure apt体系。

这次升级ubuntu 9.10系统后直接把/etc/apt/sources.list里面google、opera和skype的源的地址直接拷贝了过来,结果apt-get update的时候总是报gpg签名的错误:

“W: A error occurred during the signature verification. The repository is not updated and the previous index files will be used.GPG error: http://dl.google.com stable Release: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY A040830F7FAC5991“

详细查探了一下原因,原来是因为debian 的 secure apt体系的约束。

secure apt也叫apt-secure是从apt 0.6版本开始引入,时间是在2003年。secure apt的作用是使用数字签名和加密对所有下载包的进行验证。

数字签名目前同时使用了md5、sha-1、sha256等三种签名方式。
首先在每个源、每种架构(i386、amd64)目录都存在了一个Packages.bz2内保存了所有包的checksum文件
例如:

wget http://archive.ubuntu.com/ubuntu/dists/lucid-security/multiverse/binary-i386/Packages.bz2
bzless Packages.bz2

可以看到如下内容:

Filename: pool/multiverse/f/flashplugin-nonfree/flashplugin-installer_10.1.53.64ubuntu0.10.04.1_i386.deb
Size: 19748
MD5sum: 9f0e2dcbdcbfe5df425334aabcd19b68
SHA1: 59dbb008eeba133a994e6a440042f49ed4876175
SHA256: 60d0ded6de08418ee99aa5d667bed9f1e4d2f76334e188b21386abdb343821f3

同时为了保证Packages.bz2的完整性呢, 又通过在的Release文件内加入对Package.bz2文件的签名来保证:
可以打开http://archive.ubuntu.com/ubuntu/dists/lucid-security/Release文件查看。

那么,Release文件的完整性如何来保证?此时为Release引入了GPG签名,可见http://archive.ubuntu.com/ubuntu/dists/lucid-security
/Release.gpg

当执行

apt-get update

apt系统先取到Release.gpg,此文件是一个GPG的签名结果,apt使用存储在/etc/apt/trusted.gpg内的GPG key对同位置下的Release文件进行签名,并把签名结果和Release.gpg进行比较,如果相同就通过,否则就会报最开始的“NO_PUBKEY”错误。

验证apt key的匹配可以通过以下步骤进行验证:

cd /var/lib/apt/lists
gpgv --keyring /etc/apt/trusted.gpg archive.ubuntu.com_ubuntu_dists_lucid-updates_Release.gpg\ archive.ubuntu.com_ubuntu_dists_lucid-updates_Release

同时列出当前的apt key(通过读取/etc/apt/trusted.gpg文件):

apt-key list

添加一个key

gpg --keyserver subkeys.pgp.net --recv-keys
gpg -a --export  | sudo apt-key add -

同时查看一个软件包的HASH签名:

apt-cache show  | egrep '(^MD5|^SHA1|^SHA256)'

参考资料
http://wiki.debian.org/SecureApt