Hallo,
ich habe momentan ein kleines Problem, wo ich auch nach einigen Stunden Google und anderen Foren noch keinen wirklichen Ansatz gefunden habe, warum das nicht geht wie ich will.
Kurze Zusammenfassung: für eine Serveranwendung möchte ich verschlüsselte Verbindungen via SSL nutzen. Das Zertifikat wird beim ersten Start der Anwendung (nicht...) generiert und ist daher erst einmal selbst signiert. Die benötigten Informationen werden auf der Kommandozeile abgefragt und dann in einen Aufruf des Programms "keytool" umgeschrieben und dieser wiederum per
ausgeführt.
Das Problem: unter Windows funktioniert alles einwandfrei (schon seltsam) und unter Linux ignoriert er den exec() Aufruf einfach. Es wird kein Keystore erstellt, das Zertifikat somit auch nicht und exportiert erst recht nicht. Die Frage ist, woran das liegt. Wenn ich mir den Prozess-Rückgabewert anzeigen lasse, kommt unter Windows eine "0" was ja für Erfolg steht, unter Linux (Debian 7 in meinem Fall) eine "1" - wenn ich über den InputStream vom Prozess Ausgaben anzeigen möchte, kommt aber in beiden Fällen keine Ausgabe. Witzig ist auch, dass wenn ich mir das erzeugte Kommando bzw. den Aufruf auf der Konsole ausgeben lasse und diesen dann manuell ausführe, es unter Linux UND Windows funktioniert.
Liegt möglicherweise eine fehlerhafte Implementierung der exec() Methode im OpenJDK vor?
Hier der Code:
Ich wäre euch wirklich sehr dankbar, wenn ihr einen Ansatz liefern würdet, der hier weiterhilft. Ich bin verdammt verzweifelt.
Danke!
ich habe momentan ein kleines Problem, wo ich auch nach einigen Stunden Google und anderen Foren noch keinen wirklichen Ansatz gefunden habe, warum das nicht geht wie ich will.
Kurze Zusammenfassung: für eine Serveranwendung möchte ich verschlüsselte Verbindungen via SSL nutzen. Das Zertifikat wird beim ersten Start der Anwendung (nicht...) generiert und ist daher erst einmal selbst signiert. Die benötigten Informationen werden auf der Kommandozeile abgefragt und dann in einen Aufruf des Programms "keytool" umgeschrieben und dieser wiederum per
Code:
Runtime.getRuntime().exec(command)
Das Problem: unter Windows funktioniert alles einwandfrei (schon seltsam) und unter Linux ignoriert er den exec() Aufruf einfach. Es wird kein Keystore erstellt, das Zertifikat somit auch nicht und exportiert erst recht nicht. Die Frage ist, woran das liegt. Wenn ich mir den Prozess-Rückgabewert anzeigen lasse, kommt unter Windows eine "0" was ja für Erfolg steht, unter Linux (Debian 7 in meinem Fall) eine "1" - wenn ich über den InputStream vom Prozess Ausgaben anzeigen möchte, kommt aber in beiden Fällen keine Ausgabe. Witzig ist auch, dass wenn ich mir das erzeugte Kommando bzw. den Aufruf auf der Konsole ausgeben lasse und diesen dann manuell ausführe, es unter Linux UND Windows funktioniert.
Liegt möglicherweise eine fehlerhafte Implementierung der exec() Methode im OpenJDK vor?
Hier der Code:
Java:
private static void initKeystore()
{
Scanner scr = new Scanner(System.in);
System.out.println("**** IMPORTANT ****");
System.out.println("You don't have a certificate for using SSL yet.");
System.out.println("We will create it together now!");
System.out.println();
System.out.print("Name of your organisation: ");
String ssl_o = scr.nextLine();
String ssl_ou = ssl_o;
System.out.print("Your name: ");
String ssl_cn = scr.nextLine();
System.out.print("Country code [de/en/fr]: ");
String ssl_c = scr.nextLine();
System.out.print("City: ");
String ssl_l = scr.nextLine();
System.out.print("State: ");
String ssl_st = scr.nextLine();
System.out.print("Password: ");
String pass = new String(scr.nextLine());
String execString = System.getProperty("java.home") + "/bin/keytool -genkey -keyalg RSA -alias dreamim -keystore " + KEYSTORE + " -storepass " + pass + " -validity 360 -dname \"cn=" + ssl_cn + ", o=" + ssl_o + ", ou=" + ssl_ou + ", c=" + ssl_c + ", l=" + ssl_l + ", st=" + ssl_st + "\" -keypass " + pass;
System.out.println(execString);
try
{
Process proc = Runtime.getRuntime().exec(execString);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null)
{
System.out.println(line);
}
bufferedReader.close();
proc.waitFor();
System.out.println("Key generation exited with code: " + proc.exitValue());
execString = System.getProperty("java.home") + "/bin/keytool -export -keystore " + KEYSTORE + " -storepass " + pass + " -alias dreamim -file Certificate.crt";
proc = Runtime.getRuntime().exec(execString);
proc.waitFor();
System.out.println("Please visit xxx for instructions how to deliver your SSL certificate for your users.");
}
catch (Exception e)
{
// Exception-Handling ausbauen
e.printStackTrace();
}
// Keystore Passwort an die Hauptklasse weiterleiten.
scr.close();
}
Ich wäre euch wirklich sehr dankbar, wenn ihr einen Ansatz liefern würdet, der hier weiterhilft. Ich bin verdammt verzweifelt.
Danke!
Zuletzt bearbeitet: