使用JavaScript解码PKCS12文件并从中获得加密私钥的最佳方法

Best approch to decode the PKCS12 file and get the encrypted private key from it using JavaScript

本文关键字:加密 私钥 方法 最佳 解码 JavaScript PKCS12 文件 使用      更新时间:2023-09-26

请建议使用JavaScript解码PKCS12文件并从中获得加密私钥的任何想法。我知道这可以很容易地完成使用Java Keytool命令和Java安全包。但我希望它是由Java脚本完成。以下是我的实际要求。

我有一个"。"P12"扩展文件,是pkcs12的其中一种格式。首先应该对其进行解码,并且需要跟踪已解码的文件,即加密私钥的确切位置。需要得到加密的私钥并解密并将其发送给接收者。所有这些只能在JAVASCRIPT中完成。

我想这可能是你正在寻找的:

" JavaScript中TLS(和其他各种加密工具)的本地实现。"

https://github.com/digitalbazaar/forge pkcs12

这个例子听起来很接近:

// decode p12 from base64
var p12Der = forge.util.decode64(p12b64);
// get p12 as ASN.1 object
var p12Asn1 = forge.asn1.fromDer(p12Der);
// decrypt p12
var p12 = forge.pkcs12.pkcs12FromAsn1(p12Asn1, 'password');
// look at pkcs12.safeContents
// generate p12, base64 encode
var p12Asn1 = forge.pkcs12.toPkcs12Asn1(
  privateKey, certificateChain, 'password');
var p12Der = forge.asn1.ToDer(p12Asn1).getBytes();
var p12b64 = forge.util.encode64(p12Der);

Rgds…Hoonto/马特

这将工作完美

   // get p12 as ASN.1 object
  var p12Asn1 = forge.asn1.fromDer(buffer);
  // decrypt p12 using the password 'password'
  var p12 = forge.pkcs12.pkcs12FromAsn1(p12Asn1, password);
  // get bags by type
  var certBags = p12.getBags({bagType: forge.pki.oids.certBag});
  var pkeyBags = p12.getBags({bagType: forge.pki.oids.pkcs8ShroudedKeyBag});
  // fetching certBag
  var certBag = certBags[forge.pki.oids.certBag][0];
  // fetching keyBag
  var keybag = pkeyBags[forge.pki.oids.pkcs8ShroudedKeyBag][0];
  // generate pem from private key
  var privateKeyPem = forge.pki.privateKeyToPem(keybag.key);
  // generate pem from cert
  var certificate = forge.pki.certificateToPem(certBag.cert);

多亏了@Ujjawal和@hoonto的例子,我才能够很好地完成下面的工作。

const decodePKCS12 = (
  file // Dom File object
) => {
  return new Promise((resolve, reject) => {
    const reader = new FileReader()
    reader.onload = evt => {
      try {
        const binary = evt && evt.target ? evt.target.result : null
        if (!binary) {
          reject(new Error('No file data'))
        }
        const p12Asn1 = asn1.fromDer(binary)
        const p12 = pkcs12.pkcs12FromAsn1(p12Asn1)
        const certBags = p12.getBags({bagType: pki.oids.certBag})
        const pkeyBags = p12.getBags({bagType: pki.oids.pkcs8ShroudedKeyBag})
        const certBag = certBags[pki.oids.certBag][0]
        const keybag = pkeyBags[pki.oids.pkcs8ShroudedKeyBag][0]
        const certificate = pki.certificateToPem(certBag.cert)
        const privateKey = pki.privateKeyToPem(keybag.key)
        resolve({certificate, privateKey})
      } catch (e) {
        reject(e)
      }
    }
    reader.onerror = reject
    reader.readAsBinaryString(file)
  })
}