2017-03-23 2 views
2

Je dois écrire une fonction en javascript (forge) qui obtient une vignette d'un certificat pfx. J'ai créé un certificat de test (mypfx.pfx). En utilisant la bibliothèque C# X509Certificate2, je peux voir l'empreinte du certificat d'entrée dans l'objet X509Certificate2 en passant le fichier bytes array et le mot de passe. Voici C# extrait de code:Comment obtenir X509Certificate thumbprint en Javascript?

X509Certificate2 certificate = new X509Certificate2(byteArrayCertData, password); 
var thumbprint = certificate.Thumbprint; 
//thumbprint is a hex encoding SHA-1 hash 

Mais quand je suis en train de faire la même chose en javascript (en utilisant forge). Je ne peux pas obtenir une empreinte de pouce correcte. Voici mon code Javascript:

var certi = fs.readFileSync('c:/mypfx.pfx'); 
    let p12b64 = Buffer(certi).toString('base64'); 
    let p12Der = forge.util.decode64(p12b64); 
    var outAsn1 = forge.asn1.fromDer(p12Der); 
    var pkcs12 = forge.pkcs12.pkcs12FromAsn1(outAsn1, false, "1234"); 
    var fp = null; 
    for (var sci = 0; sci < pkcs12.safeContents.length; ++sci) { 
    var safeContents = pkcs12.safeContents[sci]; 

    for (var sbi = 0; sbi < safeContents.safeBags.length; ++sbi) { 
     var safeBag = safeContents.safeBags[sbi]; 
     if (safeBag.cert != undefined && safeBag.cert.publicKey != undefined) { 
     fp = forge.pki.getPublicKeyFingerprint(safeBag.cert.publicKey, {type: 'RSAPublicKey'}); 
     //Is this fingerprint value I am looking for?? 
     break; 
     } 
    } 
    } 

Le résultat est une valeur différente de celle de C# thumbprint qui semble être fausse. J'ai essayé différentes fonctions dans le fichier pkcs12.js. Aucun d'entre eux ne fonctionne. Il est acceptable d'utiliser une autre bibliothèque JS tant que le résultat de l'empreinte est correct. S'il vous plaît, aidez et corrigez les erreurs que j'ai faites. Merci!

Répondre

2

Vous comparez différentes données. L'empreinte du certificat n'est pas la même que l'empreinte de la clé publique.

L'empreinte du certificat est un hachage calculé sur l'ensemble du certificat. Il semble aller de ne pas une méthode, mais vous pouvez calculer vous-même

//SHA-1 on certificate binary data 
var md = forge.md.sha1.create(); 
md.start(); 
md.update(certDer); 
var digest = md.digest(); 

//print as HEX 
var hex = digest.toHex(); 
console.log(hex); 

Pour convertir le certificat de forge à DER (binaire), vous pouvez utiliser ce

var certAsn1 = forge.pki.certificateToAsn1(cert); 
var certDer = forge.asn1.toDer(certAsn1).getBytes(); 
+0

C'est exactement ce que je cherche, merci . – Void