wake-up-neo.com

PKCS # 12: DerInputStream.getLength () -Ausnahme

Ich generiere ein Zertifikat mit dem Befehl keytool:

keytool -genkeypair -alias myRSAKey -keyalg RSA -keysize 1024 -keystore test.p12 -storepass test -storetype pkcs12

Wenn ich dann versuche, es mit der Java-Sicherheits-API zu laden, nachdem ich die Datei als Byte [] erhalten habe:

KeyStore ks = KeyStore.getInstance("PKCS12");
try{
   ks.load(new ByteArrayInputStream(data), "test".toCharArray())
} catch (Exception e){
   ...
}

Ich erhalte eine DerInputStream.getLength (): lengthTag = 127, zu große Ausnahme.

Was ist falsch?

16
karlipoppins

Ich hatte dieses Problem und habe die Tiefen von Google durchsucht und konnte die Antwort immer noch nicht finden. Nachdem ich einige Tage mit einem schrecklichen Qualitätscode gekämpft hatte, fand ich heraus, was diesen Fehler verursachte.

KeyStore.load(InputStream is, String pass);

für diese Methode wird ein InputStream benötigt, und wenn ein Problem mit einem solchen InputStream auftritt, wird diese Ausnahme ausgelöst. Einige Probleme, auf die ich gestoßen bin:

  • Der InputStream verweist auf die falsche/leere/gerade erstellte Datei
  • Der InputStream ist bereits geöffnet oder die Ressource wird von etwas anderem gespeichert
  • Der InputStream wurde bereits verwendet und gelesen , daher ist die Position des nächsten Bytes von InputStream sein Ende

Der letzte war für mein Problem verantwortlich. Der Code erstellte einen InputStream aus einem Zertifikat und fuhr damit fort, es in zwei KeyStore.load () - Aufrufen zu verwenden. Der erste war erfolgreich, der zweite hatte immer diesen Fehler.

16
ibrabeicker

Wahrscheinlich hat das von Ihnen erstellte Zertifikat am Ende ein zusätzliches Zeichen, das als ein anderes Zertifikat falsch interpretiert wird.

Siehe: Java-Zertifikatsanalyse

8
Amanpreet

Für andere mit einem ähnlichen Problem:

"keystore load: DerInputStream.getLength(): lengthTag=109, too big."

Für mich bestand die Lösung darin, den Parameter param: -storetype pkcs12 Zu entfernen, da der Standardtyp jks ist

5
Jan vO

Geben Sie den Typ des Zertifikats im Code An, zum Beispiel:

System.setProperty("javax.net.ssl.trustStoreType", "jks");
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12"); 
2

Mein Problem (lengthTag=109, too big) war die .p12-Datei tatsächlich im JKS-Format und nicht im PKCS # 12-Format. Jemand hat die Dateierweiterung umbenannt. Durch die Neuerstellung im richtigen PKCS-Format wurde das Problem behoben.

Java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.
    at Sun.security.util.DerInputStream.getLength(DerInputStream.Java:599)
    at Sun.security.util.DerValue.init(DerValue.Java:365)
    at Sun.security.util.DerValue.<init>(DerValue.Java:320)
    at Sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.Java:1914)
    at Java.security.KeyStore.load(KeyStore.Java:1445)

Um das Format einer Sicherheitsdatei zu überprüfen, können Sie KeyStore Explorer verwenden, um die Datei zu öffnen. Die linke untere Leiste zeigt das aktuelle Format.

1
Lee Chee Kiam

Dies ist mir in Android Studio nach der AndroidX-Migration und unter Verwendung des neuen Testframeworks passiert. Auch das Löschen des vorhandenen ~/.Android/debug.keystore hat bei mir versagt

Die Lösung wurde manuell neu generiert (alle Fragen als leer akzeptieren und beim letzten ja sagen)

$ keytool -genkey -v -keystore debug.keystore -storepass Android -alias androiddebugkey -keypass Android -keyalg RSA -keysize 2048 -validity 10000

nd kopiere es

$ rm ~/.Android/debug.keystore
$ cp debug.keystore ~/.Android/debug.keystore
0
Rohit Mandiwal

Dies ist mir passiert, weil ich die .p12-Datei lokal auf meinem Windows 10-Rechner kopiert und eingefügt hatte. Keine Ahnung, warum/warum dies ein Problem ist, aber wenn ich ein Projekt mit .p12-Dateien klone und meinen Code darauf zeige, funktionieren die Dateien. Das Kopieren und Einfügen der Dateien im Windows-Datei-Explorer an eine andere Stelle auf der Festplatte führt jedoch zu diesem Fehler.

0
Adam Hughes

Du machst etwas falsch.
Ich habe Ihren Befehl ausprobiert und den p12 gut geladen.
Der folgende Code funktioniert: 

 FileInputStream fin = new FileInputStream("..\\test.p12");
 KeyStore ks = KeyStore.getInstance("PKCS12");
 ks.load(fin, "123456".toCharArray());
 System.out.println(ks.getCertificate("myrsakey"));

Ich habe mich gefragt, ob Sie den Befehl so setzen, dass Sie vom keytool eine Fehlermeldung erhalten, dass das Passwort mindestens 6 Zeichen lang sein muss.
Sie haben diesen Fehler nicht erhalten? Welche Java-Version verwenden Sie?
Hinweis: Wenn Sie Zertifikate erstellen müssen, können Sie auch dieses Tool betrachten.
http://sourceforge.net/projects/certhelper/

0
Cratylus

Ich hatte das gleiche Problem.

Meine Lösung ist, PKCS12 durch jceks in der Zeile unten zu ersetzen, da ich anscheinend den falschen Typ verwendet habe. 

KeyStore clientStore = KeyStore.getInstance("PKCS12");
0
sindacco