keytool和openssl证书指纹不匹配

问题描述:

我试图在研究目的中指定META-INF /内的android开发人员证书。keytool和openssl证书指纹不匹配

我发现某些场景中,从密钥工具和OpenSSL输出会给我为同一证书不同的SHA1指纹:

使用密钥工具:

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应用程序在这种情况发生的名称。

在此先感谢。

不同的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 81处于long 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结构完全相同的字节表示。

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

+0

谢谢你的回答。 我在keytool命令中没有看到多个证书,我只是获得openssl在转换文件时获得的相同证书,但是它们的指纹是不同的。 – VdS

+0

@VdS你能否以某种方式提供文件CERT.RSA作为下载? – Omikron

+0

嗨@Omikron,链接是http:// sharesend。com/hig38jz0。我现在遇到文件交换服务问题,如果你想在任何其他地方上传,我可以在晚上做。谢谢! – VdS