【问题标题】:Forge Errors with reading p12 and pfx files读取 p12 和 pfx 文件时出现伪造错误
【发布时间】:2014-11-19 15:15:30
【问题描述】:

我在尝试读取/解码 p12 和 pfx 文件时遇到以下错误:

Cannot read PKCS#12 PFX. ASN.1 object is not an PKCS#12 PFX

Too few bytes to read ASN.1 value.

我正在尝试使用以下 Javascript 读取文件:

<input id="cert-file" type="file" name="cert" /><output id="p12cert"></output>

使用 JQuery,我附加了一个“on change”事件处理程序,以检查所选文件。

$j("#cert-file").change(handleFileSelect);

function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object
    getFile(files[0]);    
}

然后我尝试读取文件并使用 forge 对其进行解码。

function getFile(p12cert)
{
    var reader = new FileReader();

    var password = 'password';

    reader.onload = (function (theFile) {
        return function(eve) {

            var p12Der = forge.util.decode64(eve.target.result);

            // get p12 as ASN.1 object
            // Not working for one of my p12 files
            var p12Asn1 = forge.asn1.fromDer(p12Der);

            // decrypt p12 using the password 'password'
            // TODO: Not working for some reason for p12 and pfx file
            var p12 = forge.pkcs12.pkcs12FromAsn1(p12Asn1, password);
        };
    })(p12cert);

reader.readAsText(p12cert);

}

我不确定我是否只是错误地读取了文件。我从here 开始使用 FileReader 示例。我做错了什么还是我的证书可能有问题?

【问题讨论】:

    标签: javascript pkcs#12 forge


    【解决方案1】:

    更新:看起来问题是在数据传递给伪造之前发生的。未以正确的格式读取数据。您可以尝试以下选项之一:

    选项 1:

    reader.readAsDataURL(p12cert); // change from readAsText
    
    // in reader.onload, parse out the base64 part:
    var p12Der = forge.util.decode64(eve.target.result.split(',')[1]);
    

    选项 2:

    reader.readAsBinaryString(p12cert); // change from readAsText
    
    // in reader.onload, skip base64 decoding step entirely since the data is
    // already in a binary string that forge can work with -- the downside
    // is that this method is deprecated in the FileReader API
    var p12Der = eve.target.result;
    

    选项 3:

    // instead, use an ArrayBuffer
    reader.readAsArrayBuffer(p12cert);
    
    // in reader.onload, convert to base64 and then decode as you were doing before
    var b64 = forge.util.binary.base64.encode(new Uint8Array(eve.target.result));
    

    选项 4:

    // instead, use an ArrayBuffer
    reader.readAsArrayBuffer(p12cert);
    
    // in reader.onload, just do a raw conversion to a binary string and skip
    // the base64 decoding (though this may cause a stack overflow
    // with the current implementation in forge which is experimental)
    var p12Der = forge.util.binary.raw.encode(new Uint8Array(eve.target.result));
    

    您是否尝试过在非严格模式下加载 PKCS#12?这通常会解决这个特定的错误:

    var p12Asn1 = forge.asn1.fromDer(p12Der, false);
    
    var p12 = forge.pkcs12.pkcs12FromAsn1(p12Asn1, false, password);
    

    【讨论】:

    • 这确实解决了第二个错误!但是,我仍然收到第一个错误:无法读取 PKCS#12 PFX。 ASN.1 对象不是 PKCS#12 PFX。
    • 错误应该有一个属性“.errors”,如果你把它打印出来,它可能会显示更多信息。您还可以执行 console.log(forge.asn1.prettyPrint(p12Asn1)) 来查看从 DER 数据中解析出的内容。
    • 谢谢!!非常有帮助。我希望我可以投票,但还不是那个代表。
    【解决方案2】:

    这将完美运行

      // get p12 as ASN.1 object
      //here buffer is a result for readFileSync pkcs12 file
    
      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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      相关资源
      最近更新 更多