OpenSSL拒绝验证签名

时间:2018-08-22 23:57:33

标签: openssl

我确定我很傻,但是我正在尝试在macOS上安装GPGSuite。我已经下载了文件和签名,以及它们的公共密钥(https://gpgtools.org/GPGTools-00D026C4.asc)。然后,我尝试了以下命令:

openssl base64 -d -in <signature> -out /tmp/sign.sha256
openssl dgst -sha256 -verify <pub-key> -signature /tmp/sign.sha256 <file>

其中pub-key是我从链接中复制并粘贴了公共密钥的文件。

第一个工作正常,第二个给出了“无法加载密钥文件”的相当无益的响应。我试图在网上找到答案,但是所有答案似乎都与试图使用证书代替公钥的人有关,我不相信我在这样做。

我很高兴这是一个菜鸟问题,但是有人可以指出正确的方向吗?

1 个答案:

答案 0 :(得分:1)

元:这不是编程问题,而且可能是题外话。

GnuPG使用的密钥格式(私钥和公钥)以及OpenPGP的其他实现与OpenSSL所使用的完全不同。 PGP格式(二进制和“装甲的”)在RFC4880等中定义; OpenSSL使用基于X.680 et seq现在定义的ASN.1 encoding和由PK1421或RFC7468定义的'PEM'(至少类似于PEM)包装,由PKCS1(RFC8017等)定义的RSA特定格式和通用格式PKCS8(RFC5208)和X.509(可在RFC5280 et pred和RFC3279上获得)也基于ASN.1和'PEM'定义。

关于这些差异,在几个堆栈上有很多问题,但是我找不到涵盖您需要的方向的问题,这就是PGP对OpenSSL的公开。 https://superuser.com/questions/360507/are-gpg-and-ssh-keys-interchangable最接近,至少表示困难。 (尽管在Q中没有明确说明,但在具有GPG的系统上,SSH通常指的是OpenSSH,在问Q时,SSH使用的是OpenSSL格式的私钥,但不是公钥。)

但是,这不能解决您的问题,因为该签名是PGP(分离的)签名,它与PGP公钥块一样使用PGP消息/数据包格式,而openssl dgst -sign/verify仅使用原始(k / 8)字节值。更重要的是,PGP签名算法除了实际的消息/文件之外还包括一些元数据,特别是消息的“散列子分组”(与未散列子分组相对);您必须编写大量的代码(将是将是ontopic!)来处理该问题。

我建议您改用HTTPS上提供的SHA256(并由此通过身份验证)来验证您的下载。