4

请提出任何想法来解码 PKCS12 文件并使用 JavaScript 从中获取加密的私钥。我知道使用 Java Keytool 命令和 Java Security 包可以很容易地完成它。但我希望它由 Java Script 完成。贝娄是我的实际要求。

我有一个“.p12”扩展文件,它是 pkcs12 的格式之一。它应该首先被解码,并且需要追踪解码后的文件,该文件正是放置了加密的私钥。需要获取该加密的私钥并将其解密并将其发送给接收者。而这一切都应该只在 JAVASCRIPT 中完成。

4

3 回答 3

4

我认为这可能是您正在寻找的:

“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/马特

于 2013-06-19T05:00:59.747 回答
1

这将完美地工作

   // 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);
于 2017-10-31T08:27:29.320 回答
0

感谢@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)
  })
}
于 2019-10-02T03:37:54.043 回答