2016-06-01 16 views
0

Ich habe einen externen Dienst, der Zertifikat für mich erstellt, aus dem ich einen Puffer (String) erhalte. Ich versuche, diesen Puffer in einen KeyStore in Java zu laden und verwende dann die Funktion "store", um eine .p12-Datei zu erstellen. Die Speicherfunktion löst jedoch eine Ausnahme aus - "Endgültiger Block nicht richtig aufgefüllt".Erstellen einer .p12-Datei mit einem KeyStore

Egal, was ich versuche, ich kann das nicht zum Laufen bringen oder die Ursache des Problems finden.

Mein Code ist:

public void createP12Certificate(String userName, String comment) throws KeyStoreException, AdminCertificateException, CertificateException, NoSuchAlgorithmException, IOException 
{ 
    KeyStore store = KeyStore.getInstance("PKCS12"); 

    /* Some Code that gets 'buff' etc. */ 

    byte[] byteBuff = hexStringToByteArray(buff); 
    Arrays.reverse(byteBuff); 
    InputStream inputStream = new ByteArrayInputStream(byteBuff); 
    store.load(inputStream, password.toCharArray()); 
    OutputStream outputStream = new FileOutputStream(userName+".p12"); 
    store.store(outputStream,anotherPassword); //Throws Exception 
} 

Vielen Dank!

+1

Welches ist das Format, in dem Sie Inhalte empfangen? eine Kombination aus hexStringToByteArray und Arrays.reverse ist sehr seltsam – pedrofb

+0

Ich versuche, einen Code, der derzeit auf C# läuft und damit Zugriff auf .net-Funktionen in Java zu duplizieren. Sowohl Java als auch C# verwenden einen externen Web-Service, der einen Puffer (den Inhalt des Zertifikats) bereitstellt. Da dies eine Hex-Zeichenfolge ist und ein KeyStore ein Byte-Array erwartet, muss ich hexStringToByteArray verwenden. Wenn ich das Byte-Array nicht umkehre, löst Java eine Exception in der "load" -Methode aus - dass die Daten nicht im PKCS12-Format sind. C# kehrt das Byte-Array um, also habe ich es umgekehrt. Java wirft keine Ausnahme mehr in "load", aber jetzt wirft es eine in "store" wie ich beschrieben habe. – Adam

+0

Es ist möglich, dass Hex-Konvertierungen -> Bytes -> in C# und Java umgekehrt verhalten sich nicht gleich. Ich schlage vor, dass Sie sicherstellen, dass das Format vom Server zurückgegeben wird, zum Beispiel mit einem Texteditor, der Konvertierungen Hex-Bytes wie Notepad ++ unterstützt. Ohne die Datei zu sehen, kann ich nicht mehr helfen – pedrofb

Antwort

1

Das Problem ist bei diesen Linien

/* Some Code that gets 'buff' etc. */ 
byte[] byteBuff = hexStringToByteArray(buff); 

Da der andere geschrieben Code ohne Ausnahme funktionieren würde.

char[] passwordChars = "password".toCharArray(); 
String fileOne = "/tmp/output_1.p12"; 
String fileTwo = "/tmp/output_2.p12"; 

KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
keyStore.load(null, null); 
keyStore.store(new FileOutputStream(fileOne), passwordChars); 

keyStore = KeyStore.getInstance("PKCS12"); 
byte[] byteBuff = Files.readAllBytes(Paths.get(fileOne)); 
InputStream inputStream = new ByteArrayInputStream(byteBuff); 
keyStore.load(inputStream, passwordChars); 
keyStore.store(new FileOutputStream(fileTwo), passwordChars);