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?
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 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.
Wahrscheinlich hat das von Ihnen erstellte Zertifikat am Ende ein zusätzliches Zeichen, das als ein anderes Zertifikat falsch interpretiert wird.
Siehe: Java-Zertifikatsanalyse
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
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");
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.
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
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.
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/
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");