我正在尝试验证使用SHA-1散列签名的文件,并使用RSA私钥加密散列。
显然我正在使用RSA公钥进行验证。关键是DER格式。
签名验证使用Java的Signature类正常工作。
我正在尝试的openssl命令(和结果)是:
~/Downloads/openssl-1.0.0-beta3/apps/openssl pkeyutl -in encryptedZip.bin
-keyform DER -verify -sigfile savedDigitalSignature.txt -pubin -inkey public.der
WARNING: can't open config file: /usr/local/ssl/openssl.cnf
Signature Verification Failure
我在openssl配置文件中看不到任何适用的内容,所以我认为这个警告并不重要。
savedDigitalSignature.txt文件包含签名字节。
我的理论是openssl正在寻找具有某种特定文件格式的数字签名,但我没有在文档中找到任何指示应该是什么的内容。
思想?
答案 0 :(得分:2)
此命令级别很低。您必须确保所有内容都采用正确的格式才能正常工作,
答案 1 :(得分:0)
我还没有使用OpenSSL-1.0.0-beta3,所以我不熟悉pkeyutl
,但dgst
命令也会生成并验证数字签名,并且它希望签名到是简单的,完全朴素的二进制文件。
例如,对于RSA签名,它期望二进制blob代表单个BigNum。查看pkeyutl的maual页面,它似乎可能以相同的方式工作。一个简单的测试是使用pkeyutl签名,并检查输出(如果位的大小与您的RSA密钥长度相同,它是一个普通的BigNum - 如果它更大,请尝试使用dumpasn1来查看它是否为DER格式)。
答案 2 :(得分:0)
Java期望RSA签名遵循PKCS#1:摘要算法和摘要的序列,然后签名(使用RSA私钥加密)。
pkeyutl
可能只期待摘要,而不是ASN.1结构,但这可能会令人惊讶地忽视互操作性。在任何一种情况下,一旦数据被“签名”,“签名”输出将显得类似......只是一个随机的八位字符串。
请发布由pkeyutl
生成的示例签名,以及将对其进行验证的公钥以及要验证的文件。