如何通过节点锻造获得 AWS 从 x.509 中使用的相同指纹?



如何使用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。

相关内容

  • 没有找到相关文章

最新更新