我正在尝试验证包裹上的签名FreeBSD 软件包网站
wget http://pkg.freebsd.org/FreeBSD:11:amd64/latest/digests.txz
tar xf digests.txz
这给出了三个文件:digests
,digests.pub
digests.sig
我认为这是作为公钥的digests.sig
文件的签名。但我试图确认:digests
digests.pub
openssl dgst -verify digests.pub -signature digests.sig digests
并收到消息
Verification Failure
我认为我出了什么问题 - 谁能告诉我我错过了什么?
编辑:基于对源代码的搜寻,我思考重要的功能是要找到的这里,从 openssl 库rsa_verify_cert_cb
调用。RSA_verify
但我还没有弄清楚向其中输入了什么,或者是否可以使用openssl
命令行工具调用该函数。
答案1
由于互联网上没有关于手动 FreeBSD 包验证的“如何”,所以这就是我所了解的。
技巧是输出中的八位字节字符串openssl rsautl
实际上是字符串的哈希值,即 SHA256 哈希值一个文件的。
例如,下载 current http://pkg.freebsd.org/FreeBSD:12:amd64/latest/digests.txz
,解压它并执行以下操作:
方法一(单行使用openssl dgst
)
这里重要的是tr -d '\n'
从标准输入中删除新行,因此它不包含在 的字符串输入中openssl dgst
。
sha256 -q digests | tr -d '\n' | openssl dgst -verify digests.pub -signature digests.sig
该命令应该输出Verified OK
.
方法 2(将 .sig 文件中的八位字节字符串与手动生成的哈希进行直观比较)
使用 OpenSSL 实用程序转储digests.sig 中的内容
openssl rsautl -pubin -inkey digests.pub -verify -in digests.sig -asn1parse 0:d=0 hl=2 l= 49 cons: SEQUENCE 2:d=1 hl=2 l= 13 cons: SEQUENCE 4:d=2 hl=2 l= 9 prim: OBJECT :sha256 15:d=2 hl=2 l= 0 prim: NULL 17:d=1 hl=2 l= 32 prim: OCTET STRING 0000 - ac c6 ac be cd 5e 61 63-62 82 62 4b ba 77 37 6e .....^acb.bK.w7n 0010 - 0b fa ea ef 6e 10 21 01-62 64 06 2f d0 f1 60 22 ....n.!.bd./..`"
在这里您可以看到嵌入的对象是 SHA256 哈希值,其值为
acc6acbecd5e61636282624bba77376e0bfaeaef6e1021016264062fd0f16022
。现在计算文件的 SHA256
digests
:sha256 -q digests 8db18c93bea414fd8a281f5f3795b2ca4be51479c18b225ff87b8aa957ec2c5d
- 最后使用
echo
命令计算该字符串的 SHA256 并与返回的值进行比较openssl rsautl
:echo -n 8db18c93bea414fd8a281f5f3795b2ca4be51479c18b225ff87b8aa957ec2c5d | sha256 acc6acbecd5e61636282624bba77376e0bfaeaef6e1021016264062fd0f16022
请注意步骤 3. 中的值如何与步骤 1. 中的值匹配,因此文件digests
有效。
答案2
该消息表明公钥与您下载的文件不匹配。根据 dgst 的联机帮助页-verify filename 使用“filename”中的公钥验证签名。 输出是“验证成功”或“验证失败”最可能的原因是文件在下载过程中损坏。我会尝试再次下载它,如果它仍然无法通过检查,那么这就是下载链接受损的迹象(但由于它来自 freebsd 网站,我怀疑这只是一个下载错误。即便如此,我也会验证新的为了安全起见,请下载)。如果您的互联网连接速度慢/不可靠,可能需要尝试几次才能正确下载。如果您需要检查有关命令的信息,那么检查联机帮助页总是一个好主意 (man )