Ich möchte, dass Keytool eine p12-Datei in cacert (Java-Keystore) importiert. Das manuelle Ausführen des Imports von der Befehlszeile im tatsächlichen Betrieb ist zeitaufwändig und unrealistisch. Daher möchte ich ihn als Prozess einer laufenden Webanwendung einbeziehen.
Da es so eingestellt wurde, dass nur der Administrator cacerts neu schreiben kann, erhält der Benutzer, der die Webanwendung ausführt, ebenfalls die Berechtigung. (Das Zertifikat konnte nur importiert werden, wenn die Eingabeaufforderung mit Administratorrechten ausgeführt wurde.)
sample1.java
String JRE_PATH = "C:\\Program Files\\Java\\jre1.8.0_144";
String KEYSTORE_PATH = JRE_PATH + "\\lib\\security\\cacerts"; //cacerts Pfad
String CERTFILE_PATH = "cert.p12"; //p12 Dateipfad
String ALIAS = "test"; //alias
String KEYSTORE_PASS = "changeit"; //Keystore-Passwort
String PRIVATEKEY_PASS = "root"; //Zertifikat Passwort
//Befehl zum Importieren des Zertifikats
ProcessBuilder importCertPb = new ProcessBuilder( "keytool", "-importkeystore", "-keystore",
"\"" + KEYSTORE_PATH + "\"", "-srckeystore",
CERTFILE_PATH, "-srcstoretype", "PKCS12", "-srcstorepass", PRIVATEKEY_PASS, "-deststorepass",
KEYSTORE_PASS );
//Da es mit dem Alias "1" importiert wird, geben Sie ihm einen Alias
// XXXX:Alias (wie ein Name, der das Zertifikat eindeutig identifiziert)
ProcessBuilder changeAliasPb = new ProcessBuilder( "keytool", "-changealias", "-alias", "1", "-destalias", XXXX,
"-keystore", "\"" + KEYSTORE_PATH + "\"", "-keypass", PRIVATEKEY_PASS, "-storepass", KEYSTORE_PASS );
//Befehl zum Überprüfen, ob das Zertifikat importiert wurde
ProcessBuilder checkExistCertPb = new ProcessBuilder( "keytool", "-list", "-alias", XXXXX,
"-keystore", "\"" + KEYSTORE_PATH + "\"", "-storepass", KEYSTORE_PASS );
//Externe Prozessausführung
Process importCertPbSt = importCertPb.start();
//Warten Sie, bis der Vorgang beendet ist
importCertPbSt.waitFor();
java::sample2.java
//Alias: Führen Sie den Befehl aus, um ein Zertifikat zu erhalten, das XXXX entspricht
Process checkExistCertPbSt = checkExistCertPb.start();
checkExistCertPbSt.waitFor();
InputStream in = checkExistCertPbSt.getInputStream();
try {
String line = null;
BufferedReader br = new BufferedReader(new InputStreamReader(in));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
Der Dateipfad wird beim Ausführen eines externen Befehls über eine Java-App nicht erkannt
Recommended Posts