FreeBSD 软件包存储库 - 如何进行手动签名验证?

FreeBSD 软件包存储库 - 如何进行手动签名验证?

我正在尝试验证包裹上的签名FreeBSD 软件包网站

wget http://pkg.freebsd.org/FreeBSD:11:amd64/latest/digests.txz
tar xf digests.txz

这给出了三个文件:digestsdigests.pub digests.sig
我认为这是作为公钥的digests.sig文件的签名。但我试图确认:digestsdigests.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 文件中的八位字节字符串与手动生成的哈希进行直观比较)

  1. 使用 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

  2. 现在计算文件的 SHA256 digests

    sha256 -q digests
    8db18c93bea414fd8a281f5f3795b2ca4be51479c18b225ff87b8aa957ec2c5d
    
  3. 最后使用echo命令计算该字符串的 SHA256 并与返回的值进行比较openssl rsautl
    echo -n 8db18c93bea414fd8a281f5f3795b2ca4be51479c18b225ff87b8aa957ec2c5d | sha256
    acc6acbecd5e61636282624bba77376e0bfaeaef6e1021016264062fd0f16022
    

请注意步骤 3. 中的值如何与步骤 1. 中的值匹配,因此文件digests有效。

答案2

该消息表明公钥与您下载的文件不匹配。根据 dgst 的联机帮助页-verify filename 使用“filename”中的公钥验证签名。 输出是“验证成功”或“验证失败”最可能的原因是文件在下载过程中损坏。我会尝试再次下载它,如果它仍然无法通过检查,那么这就是下载链接受损的迹象(但由于它来自 freebsd 网站,我怀疑这只是一个下载错误。即便如此,我也会验证新的为了安全起见,请下载)。如果您的互联网连接速度慢/不可靠,可能需要尝试几次才能正确下载。如果您需要检查有关命令的信息,那么检查联机帮助页总是一个好主意 (man )

相关内容