代码之家  ›  专栏  ›  技术社区  ›  wadesworld

openssl pkeyutl需要什么格式的签名?

  •  2
  • wadesworld  · 技术社区  · 15 年前

    我正在尝试验证一个文件,该文件是通过使用sha-1进行哈希处理和使用rsa私钥加密哈希而签名的。

    显然,我正在使用RSA公钥进行验证。密钥为der格式。

    签名验证使用Java的签名类来正确工作。

    我尝试的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正在寻找某种特定文件格式的数字签名,但是在文档中我没有找到任何指示应该是什么的内容。

    思想?

    3 回复  |  直到 15 年前
        1
  •  2
  •   ZZ Coder    15 年前

    这个命令的级别很低。你必须确保一切都以正确的格式运行,

    1. 输入签名(-sigfile)必须是二进制签名。对于RSA,填充必须是PKCS 1。
    2. 输入数据必须是二进制摘要。如果使用sha1签名,则此文件只能包含20个字节。
    3. 公钥必须是以der或pem格式编码的x.509 SubjectPublicKeyInfo。
        2
  •  0
  •   caf    15 年前

    我还没有使用openssl-1.0.0-beta3,所以我不熟悉 pkeyutl 但是 dgst 命令还生成和验证数字签名,它希望签名是纯的、完全不加修饰的二进制。

    例如,对于RSA签名,它需要表示单个bignum的二进制blob。查看pkeyutl的maual页面,它的工作方式似乎是相同的。一个简单的测试方法是使用pkeyutl签名,并检查输出(如果以位为单位的大小与RSA密钥长度相同,那么它是一个普通的bignum-如果它更大,请尝试使用dumpasn1查看它是否是der格式)。

        3
  •  0
  •   erickson    15 年前

    Java期望RSA签名遵循PKCSα1:一个摘要算法和摘要的序列,然后签名(用RSA私钥加密)。

    可能是 pkeyutl 只期望得到摘要,而不是ASN.1结构,但这将是对互操作性的一个令人惊讶的忽视。在这两种情况下,一旦数据被“签名”,“签名”输出将类似……只是一个随机的八进制字符串。

    请张贴一个由 普克鲁特 ,以及将验证它的公钥和要验证的文件。