Windows证书存储中使用Forge JavaScript库导入p12文件失败

3
我正在使用 Forge 库来创建一个使用 WebCryptoAPI 生成的私钥-公钥对的 .p12 格式的自签名证书。但是,当我尝试在 Windows 证书存储中导入 .p12 文件时,会出现以下错误:

enter image description here

这个链接说可能是私钥存在问题。

下面是我使用 WebCryptoApi 生成密钥的代码片段:

window.crypto.subtle.generateKey({
    name: 'RSA-PSS',
    modulusLength: 2048,
    publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
    hash: {name: 'SHA-1'}
  }

我的锻造代码片段用于生成p12如下:
var newPkcs12Asn1 = forge.pkcs12.toPkcs12Asn1(
keys.privateKey, [cert], password,
{generateLocalKeyId: true, friendlyName: 'test'},
{algorithm: '3des'});

var newPkcs12Der = forge.asn1.toDer(newPkcs12Asn1).getBytes();
var p12b64 = forge.util.encode64(newPkcs12Der);

var downloadLink = document.createElement("a");
downloadLink.download = "example.p12";
downloadLink.innerHTML = "Download File";
downloadLink.setAttribute('href', 'data:application/x-pkcs12;base64,' + p12b64);
downloadLink.style.display = "none";

downloadLink.click();

注意:

  • 我无法在Mozilla证书存储中导入该文件。因此,p12文件可能存在问题?
  • 在导入时,Windows证书存储可以正确验证我的私钥密码,但只有完成阶段失败。

keys.privateKey 是否是来自 WebCrypto 导出的 Forge 格式?我猜测 {generateLocalKeyId: true, friendlyName: 'test'}, {algorithm: '3des'} 是一个打字错误。我认为它应该是 {generateLocalKeyId: true, friendlyName: 'test', algorithm: '3des'} - pedrofb
你可以尝试使用 RSASSA-PKCS1-v1_5 替代 RSA-PSS 吗?只是为了检查 Windows 是否支持它。同时,也尝试使用 KeystoreExplorer 打开 .p12 文件。 - pedrofb
实际上问题出在 algorithm: '3des' 上。我纠正了语法错误,现在 RSASSA-PKCS1-v1_5RSA-PSS 都可以正常工作了。但是如果没有 3des 就不行。顺便说一下,谢谢。 - user1366645
1个回答

2

如评论所示,问题是pkcs12编码参数中的语法错误。

 {generateLocalKeyId: true, friendlyName: 'test',algorithm: '3des'}

需要设置algorithm: '3des',因为默认情况下,forge使用aes-128加密p12文件。
正如在这篇文章中所述,标准化PKCS#12的RFC7292并没有指定需要支持AES,但有足够的信息以可互操作的方式使用它。Windows(甚至是Windows10)无法使用更安全的加密方案和密码与生成的文件一起工作。因此,可以使用的最安全的算法是triple-des。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接