keytool和openssl证书指纹不匹配

时间:2015-11-03 09:54:32

标签: android openssl keytool

我试图在META-INF /中指纹android开发人员证书,用于研究目的。

我发现某些情况,其中来自keytool和openssl的输出会为我提供相同证书的不同SHA1指纹:

使用keytool:

keytool -princert -file META-INF/CERT.RSA
...
    SHA1: 9D:17:FB:AB:67:BB:D0:7B:12:FE:E8:33:7D:66:F1:C4:2B:03:BD:F7
...

使用openssl:

openssl pkcs7 -inform DER -in META-INF/CERT.RSA -print_certs -out CERT.cert
openssl x509 -in CERT.cert -fingerprint -noout
     SHA1 Fingerprint=80:D5:CD:66:6E:44:75:62:A8:B3:7E:5D:AC:00:DE:1D:FF:6B:E6:CA

这是正常的吗 - keytool使用自己的方式来指纹证书,这与openssl不同,我做错了什么,或者某处有错误?

顺便说一句,我不是专家,所以随时提出建议,即使是最基本的东西!

如果你需要一个例子,我可以给你一个Android应用程序的名称。

提前致谢。

1 个答案:

答案 0 :(得分:1)

不同的SHA1指纹是由代码签名证书的不同编码引起的。

第一个指纹(通过keytool)计算在证书字节上,与PKCS#7文件META-INF/CERT.RSA中包含的完全相同。签名的长度(证书的长度,而不是代码的签名)在这里以两个字节编码,其中实际上一个字节就足够了。要看到这一点,我们必须查看CERT.RSA的ASN.1转储。有几个程序可以做到这一点,但我推荐Peter Gutmann的dumpasn1/GUIdumpASN。相关部分是:

    <06 09>
532   9:             OBJECT IDENTIFIER
       :               sha1WithRSAEncryption (1 2 840 113549 1 1 5)
    <05 00>
543   0:             NULL
       :             }
    <03 82 00 81>
545 129:           BIT STRING    
       :             65 26 30 0C 41 32 63 75    e&0.A2cu
       :             2F B7 DF 9A 96 37 72 1B    /....7r.

字节82 00 81long form中编码的BITSTRING(证书的签名)的长度字节。

根据Distinguished Encoding Rules DER必须使用最短可能长度编码“,这应该是81 81。这意味着代码签名证书不是完全DER编码的。

使用openssl导出证书时,它会将证书重新编码为有效的DER:

    <03 81 81>
489 129:   BIT STRING    
        :     65 26 30 0C 41 32 63 75    e&0.A2cu
        :     2F B7 DF 9A 96 37 72 1B    /....7r. 

因此证书的哈希值(指纹)不同,它已经改变。

keytool和openssl都没有做错。 DER编码的要点是它始终生成与ASN.1结构完全相同的字节表示。

导致此问题的软件是创建错误代码签名证书的工具。