如何使用node-forge获取x.509证书的证书ID/指纹?
更新
我需要这个用于 AWS IoT。我一直在调查,最终发现 AWS 可能使用某种指纹算法来提取证书 ID。它没有烘焙到证书中,可能公钥被用作指纹的基础。
更新 2
运行此命令将返回正确的指纹:openssl x509 -noout -fingerprint -sha256 -inform pem -in cert.crt
如何使用节点锻造来实现这一点?
我已经把下面的放在一起,但它没有返回相同的 fp。
const fs = require('fs')
const forge = require('node-forge')
const { pki } = forge
const { promisify } = require('es6-promisify')
const readFile = promisify(fs.readFile)
async function main() {
const certPem = await readFile('./cert.crt', 'utf-8')
const cert = pki.certificateFromPem(certPem)
const fingerprint = pki.getPublicKeyFingerprint(cert.publicKey, {
md: forge.md.sha256.create(),
encoding: 'hex',
})
}
main()
要在请求的 NodeJS 代码中使用一些代码来扩展 haxpanel 的解决方案:
const crypto = require("crypto");
function getCertificateFingerprint(certString) {
const baseString = certString.match(/-----BEGIN CERTIFICATE-----s*([sS]+?)s*-----END CERTIFICATE-----/i);
const rawCert = Buffer.from(baseString[1], "base64");
const sha256sum = crypto.createHash("sha256").update(rawCert).digest("hex");
return sha256sum.toUpperCase().replace(/(.{2})(?!$)/g, "$1:");
// eg 83:6E:3E:99:58:44:AE:61:72:55:AD:C6:24:BE:5C:2D:46:21:BA:BE:87:E4:3A:38:C8:E8:09:AC:22:48:46:20
}
你来了。结果将与openssl x509 -in a.pem -fingerprint -sha256 -noout
相同
import forge from 'node-forge'
fingerprint() {
const der = forge.asn1.toDer(forge.pki.certificateToAsn1(cert)).getBytes()
const m = forge.md.sha256.create().start().update(der)
return m.digest()
.toHex()
.match(/.{2}/g)
.join(':')
.toUpperCase()
}
解决方案是:
您只需要从"-----BEGIN CERTIFICATE-----"标头和"-----END CERTIFICATE-----"页脚之间提取字符串,base64对其进行解码并计算解码数据的SHA1哈希。
在本例中为 SHA256。