我正在尝试从零开始实现一个X.509证书生成器(我知道现有的证书生成器,但我还需要另外一个)。我无法理解的是如何计算证书的SHA-1 (或任何其他)指纹。
RFC5280表示,签名函数的输入是经过编码的tbsCertificate字段。不幸的是,我计算的散列与OpenSSL生成的散列不同。下面是一个逐步的例子。
openssl x509 -fingerprint
计算其SHA-1散列。dd
(或其他任何东西)提取TBS字段,并将其存储在单独的文件中;使用sha1sum
实用程序计算其哈希值现在,我在步骤2和步骤3中得到的散列是不同的。有人能告诉我我可能做错了什么吗?
发布于 2011-01-27 23:16:30
好的,原来由OpenSSL计算的指纹只是整个证书上的一个散列(在它的二进制编码中,不是 ASCII!),而不是像我想的那样仅仅是TBS部分。
对于任何关心计算证书摘要的人,它都是以一种不同的方式完成的:哈希是在DER编码(也不是PEM字符串) TBS部件上计算的,包括它的ASN.1头( ID 0x30 == ASN1_SEQUENCE ASN1_CONSTRUCTED和length字段)。请注意,证书的ASN.1头没有被考虑在内。
发布于 2015-01-13 09:42:15
手指指纹类似于.net中的术语“拇指指纹”。下面的代码片段应该可以帮助您计算指纹:
public String generateFingerPrint(X509Certificate cert) throws CertificateEncodingException,NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
byte[] hash = digest.digest(cert.getEncoded[]);
final char delimiter = ':';
// Calculate the number of characters in our fingerprint
// ('# of bytes' * 2) chars + ('# of bytes' - 1) chars for delimiters
final int len = hash.length * 2 + hash.length - 1;
// Typically SHA-1 algorithm produces 20 bytes, i.e. len should be 59
StringBuilder fingerprint = new StringBuilder(len);
for (int i = 0; i < hash.length; i++) {
// Step 1: unsigned byte
hash[i] &= 0xff;
// Steps 2 & 3: byte to hex in two chars
// Lower cased 'x' at '%02x' enforces lower cased char for hex value!
fingerprint.append(String.format("%02x", hash[i]));
// Step 4: put delimiter
if (i < hash.length - 1) {
fingerprint.append(delimiter);
}
}
return fingerprint.toString();
}
https://stackoverflow.com/questions/4803799
复制相似问题