2014-09-25 21 views
7

ich die folgenden Fehler habe, wenn/Dekodierungs p12 lesen VERSUCHT, und pfx Dateien:Forge Fehler beim Lesen p12 und pfx Dateien

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

Too few bytes to read ASN.1 value. 

Ich versuche, die Datei in Javascript mit folgendem Wortlaut:

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

Mit JQuery, ich füge einen "On Change" Event-Handler, um die ausgewählte Datei zu überprüfen.

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

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

Dann versuche ich, die Datei zu lesen und es mit Schmiede zu decodieren.

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); 

}

bin ich nicht sicher, ob ich nur die Datei in falsch zu lesen. Ich ging von den FileReader-Beispielen von ab. Mache ich etwas falsch oder könnte etwas falsch mit meinen Zeugnissen sein?

Antwort

7

Update: Es sieht so aus, als ob das Problem auftritt, bevor die Daten zur Schmiede weitergegeben werden. Die Daten werden nicht im richtigen Format gelesen. Sie können eine dieser Optionen versuchen statt:

Option 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]); 

Option 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; 

Option 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)); 

Option 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)); 

Old:

Haben Sie versucht, die PKCS # 12 in nicht-Strict-Modus geladen? Dies wird lösen häufig diesen speziellen Fehler:

var p12Asn1 = forge.asn1.fromDer(p12Der, false); 

var p12 = forge.pkcs12.pkcs12FromAsn1(p12Asn1, false, password); 
+0

Dies hat den zweiten Fehler beheben! Allerdings bekomme ich immer noch den ersten Fehler: PKCS # 12 PFX kann nicht gelesen werden. Das ASN.1-Objekt ist kein PKCS # 12 PFX. – RavenBellVanessa

+0

Der Fehler sollte eine Eigenschaft ".errors" haben, die mehr Informationen offen legen kann, wenn Sie es ausdrucken. Sie können auch console.log (forge.asn1.prettyPrint (p12Asn1)) ausführen, um zu sehen, was aus den DER-Daten analysiert wurde. – dlongley

+0

Danke !! Sehr hilfreich. Ich wünschte, ich könnte jetzt upvote, aber noch nicht bei diesem rep. – RavenBellVanessa

0

Dies wird

perfekt arbeiten
// 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);