2011-01-26 42 views
14

Estoy tratando de implementar un generador de certificados X.509 desde cero (sé de los existentes, pero necesito uno más). Lo que no puedo entender es cómo calcular la huella digital SHA-1 (o cualquier otra) del certificado.¿Cómo se calcula la huella digital SHA-1 del certificado X.509?

El RFC5280 dice que la entrada a la función de firma es el campo tbsCertificate codificado DER. Desafortunadamente, el hash que calculo difiere del que produce OpenSSL. Aquí hay un ejemplo paso a paso.

  1. generar un certificado utilizando la herramienta x509 de OpenSSL (en una forma DER binario, no el ASCII PEM)
  2. calcular su hash SHA-1 usando openssl x509 -fingerprint
  3. extraer el campo TBS usando dd (o cualquier cosa else) y almacenarlo en un archivo separado; calcular el hash utilizando la utilidad sha1sum

Ahora, los hashes que recibo en los pasos 2 y 3 son diferentes. ¿Puede alguien darme una pista de lo que puedo estar haciendo mal?

+0

Cuando se calcula el hash SHA-1 de la tbsCertificate, ¿Está utilizando [PKCS # 1] (http://tools.ietf.org/html/ rfc2313) relleno, como se especifica en [rfc 3279] (http://tools.ietf.org/html/rfc3279)? – sarnold

+0

Uhm ... RFC2313 (PKCS # 1) solo especifica el cifrado RSA. Por lo que yo entiendo, ¿no se necesita relleno en la fase de computación de SHA-1? –

+0

Ah, dicho sea de paso, en el Paso 3 calculo el hash usando la utilidad sha1sum –

Respuesta

16

Ok, así que resultó que la huella digital calculado por OpenSSL es simplemente un hash sobre toda el certificado (en su codificación DER binario, no el PEM ASCII uno!), No sólo la parte TBS, como Pensé.

Para cualquier persona que se preocupa por el cálculo de resumen del certificado, que se lleva a cabo de una manera diferente: el hash se calcula sobre la DER codificada (de nuevo, no la cadena PEM) TBS parte única, incluyendo su ASN. 1 encabezado (el ID 0x30 == ASN1_SEQUENCE | ASN1_CONSTRUCTED y el campo de longitud). Tenga en cuenta que el encabezado ASN.1 del certificado no se tiene en cuenta.

+1

podría agregar a su respuesta (o pregunta) cómo extrajo la parte TBS con dd exactamente para referencia futura :) –

+0

Oh ... Eso fue hace bastante tiempo, así que no recuerdo los detalles. Creo que extraje manualmente el desplazamiento y la longitud TBS del hexdump del certificado, y luego usé estos valores como argumentos de dd, nada complicado –

+0

@Roman D su respuesta dice 'hash sobre todo el certificado' en el primer párrafo y 'TBS parte solo 'en el segundo párrafo. ¿Es esto un error? ¿Y cuál es la parte de TBS de un certificado? No pude encontrar nada útil de mi búsqueda en Google. – chitti

1

La huella digital es similar al término "Huella digital" en .net. A continuación fragmento de código le ayudará a calcular la huella digital:

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(); 


    } 
Cuestiones relacionadas