请提出任何想法来解码 PKCS12 文件并使用 JavaScript 从中获取加密的私钥。我知道使用 Java Keytool 命令和 Java Security 包可以很容易地完成它。但我希望它由 Java Script 完成。贝娄是我的实际要求。
我有一个“.p12”扩展文件,它是 pkcs12 的格式之一。它应该首先被解码,并且需要追踪解码后的文件,该文件正是放置了加密的私钥。需要获取该加密的私钥并将其解密并将其发送给接收者。而这一切都应该只在 JAVASCRIPT 中完成。
请提出任何想法来解码 PKCS12 文件并使用 JavaScript 从中获取加密的私钥。我知道使用 Java Keytool 命令和 Java Security 包可以很容易地完成它。但我希望它由 Java Script 完成。贝娄是我的实际要求。
我有一个“.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)
})
}