如果你想要同时验证下载文件的可靠性(拥有者)和完整性(内容),你需要依赖于加密签名。本教程中,将描述如何使用 GnuPG(GNU Privacy Guard)来检查文件的可靠性和完整性。
本例中将验证一个从 https://opensuse.org 上下载的磁盘镜像。这个网站中,发行商会提供他们的公钥,还有它用于密钥验证的指纹。
至于下载的文件,发行商提供它了相关的利用 GPG 签名的含有 sha256 校验值的文件。
安装 GnuPG 并且生成一个键对
在 Debian、Ubuntu 和其他 Debian 衍生版上:
1 | sudo apt install gpg |
在 Fedora、CentOS 或者 RHEL 上:
1 | sudo yum install gnupg |
完成安装后,生成一个键对。
在生成键对期间,用户会被要求提供姓名和 email,还有保护私钥的密码。用户同样也可以选择键对何时过期(默认不会过期)。依赖于用户选择的 key 的大小(在 1024 和 4096 位之间),key 生成会花上几分钟或者更多,同时它要求收集来自你桌面活动的大量的随机数据。(比如键盘输入、鼠标移动、磁盘访问等等,所以这个时候随便动动鼠标键盘什么的)。
一旦 key 生成完毕后,公钥和私钥会存储在 ~/.gnupg 目录。
与某个文件和拥有者建立信任
验证下载文件的第一步是与任何提供文件下载的人建立信任。出于此,需要下载这个文件的公钥,并且验证公钥的拥有者是否是他或者她自称的。
在下载完文件拥有者的公钥后,使用 gpg 命令导入公钥到你的 keyring 中
1 | gpg --import signing-key.asc |
一旦拥有者的公钥导入后,他会像下面那样打印出一个 key ID(比如:“3DBDC284”)。记住这个 key ID。
现在,运行下面的命令检查导入的公钥的指纹:
1 | gpg --fingerprint 3DBDC284 |
你会看到 key 的指纹字符串。把这个和网站上显示的指纹做对比。如果匹配,你可以选择信任这个文件拥有者的公钥。
一旦你决定相信这个公钥(不是一定要选择相信才能继续),你可以通过编辑 key 来设置信任级别:
1 | gpg --edit-key 3DBDC284 |
这个命令会显示 GPG 提示符,在 GPG 提示符中输入 “trust” ,它会让你从 1-5 之间选择这个 key 的信任等级。本例中,我决定分配给它 “4”,在这之后,输入 “sign” 用你自己的私钥签名,接着输入在 GPG 提示符中输入 “save” 来完成操作。
要注意的是不需要这样明确地给一个公钥指派信任,通过key的导入隐式地信任往往就够了。
检查导入的 key 列表:
1 | gpg --list-keys |
验证文件的可靠性/完整性
一旦你建立了与文件拥有者和他的/她的公钥之间的信任关系,我们需要验证你从拥有者那边下载的文件的可靠性和完整性了。
本例中,文件拥有者分别公布了一个文件和签名过的 .sha256 文件。签名所起的作用就是认证含有校验值的文件并且在其中加入一个时间戳。
现在让我们同时下载它的文件和签名的含有校验值的文件:
1 | wget http://verify.iso.mirrors.ustc.edu.cn/opensuse/tumbleweed/iso/openSUSE-Tumbleweed-DVD-x86_64-Snapshot20170529-Media.iso |
现在验证校验值文件的 PGP 签名:
1 | gpg --verify openSUSE-Tumbleweed-DVD-x86_64-Snapshot20170529-Media.iso.sha256 |
与签名过的文件中的 sha256 值相同,文件是完整且可靠的:
如果有 .asc 文件,即文件拥有者分别公布了一个文件和它的 asc 签名文件,一个典型的签名(*.asc)看上去像这样:
1 | -----BEGIN PGP PUBLIC KEY BLOCK----- |
那我们就这样验证:
1 | gpg --verify file.ext.asc file.ext |