如何在Javascript中获取X509Certificate指纹?

时间:2017-03-23 08:02:47

标签: javascript x509certificate2 pfx pkcs#12

我需要在javascript(forge)中编写一个函数来获取pfx证书的缩略图。我创建了一个测试证书(mypfx.pfx)。通过使用c#X509Certificate2库,我可以通过传递文件字节数组和密码来查看X509Certificate2对象中输入证书的指纹。这是c#代码段:

df <- data.frame(RSID = c("rs12345.", "rs3984.", "rs12398432.", "rs79372."),
        ALLELE = paste0(LETTERS[1:4], "."), stringsAsFactors=FALSE)

但是当我试图在javascript(使用伪造)做同样的事情。我无法获得正确的指纹。这是我的Javascript代码:

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

与c#thumbprint相比,结果是不同的值,这似乎是错误的。我在pkcs12.js文件中尝试了不同的功能。它们都不起作用。只要产生正确的指纹结果,使用其他JS库是可以接受的。请帮助并纠正我犯的任何错误。谢谢!

1 个答案:

答案 0 :(得分:2)

您正在比较不同的数据。证书指纹与公钥指纹不同。

证书指纹是在整个证书上计算的哈希值。似乎伪造没有方法,但你可以自己计算

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

要将伪造证书转换为DER(二进制),您可以使用此

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