Beachten Sie, dass ich beim Implementieren der XML-Signatur in Java stecken geblieben bin.
Aber nicht importiert. .. .. Die folgenden drei Methoden stehen zum Zeitpunkt der Ausführung in Beziehung und werden in der Reihenfolge importProcessExec ⇒ getImportCommand ⇒ processExec ausgeführt.
sample.java
/**
*Führen Sie den Zertifikatimportbefehl aus.
*
* @param certFilePath Zertifikatdatei
* @param destAlias Distinguished name
* @param keyStoreFilePath Keystore-Datei
* @param certificatePass Zertifikat Passwort
* @param keyStorePass Keystore-Passwort
* @return true:Erfolgreiche Fertigstellung, false:Abnormale Beendigung
* @throws InterruptedException
*/
private boolean importProcessExec(File keyStoreFile, String destAlias, File certFile,
String certificatePass,
String keyStorePass) throws InterruptedException {
//Befehl zum Importieren des Zertifikats
List<String> command = getImportCommand(keyStoreFile, destAlias, certFile, certificatePass,
keyStorePass);
//Importbefehl ausführen
return processExec(command);
}
/**
*Befehl zum Importieren von Zertifikaten abrufen.
*
* @param certFilePath Zertifikatdatei
* @param destAlias Distinguished name
* @param keyStoreFilePath Keystore-Datei
* @param certificatePass Zertifikat Passwort
* @param keyStorePass Keystore-Passwort
* @Befehl resultList import zurückgeben
*/
private List<String> getImportCommand(File keyStoreFile, String destAlias, File certFile,
String certificatePass, String keyStorePass) {
//Befehl zum Importieren des Zertifikats
String command = "keytool -importkeystore -keystore %keyStoreFilePath% -srckeystore %certFilePath% -srcstoretype PKCS12 -srcalias 1 -destalias %destalias% -srcstorepass %certificatePass% -deststorepass %keyStorePass%";
//Befehl in String-Array aufteilen
String[] commandList = command.split(" ");
List<String> resultList = new ArrayList<String>();
for (String cmd : commandList) {
switch (cmd) {
case "%keyStoreFilePath%":
cmd = cmd.replace("%keyStoreFilePath%", includeDoubleQuotes(keyStoreFile.getPath()));
break;
case "%certFilePath%":
cmd = cmd.replace("%certFilePath%", includeDoubleQuotes(certFile.getPath()));
break;
case "%destalias%":
cmd = cmd.replace("%destalias%", destAlias);
break;
case "%certificatePass%":
cmd = cmd.replace("%certificatePass%", certificatePass);
break;
case "%keyStorePass%":
cmd = cmd.replace("%keyStorePass%", keyStorePass);
break;
}
resultList.add(cmd);
}
return resultList;
}
/**
*Führen Sie einen externen Prozess aus.
*
* @Befehl param Befehlsinhalt
* @return true:Erfolgreiche Fertigstellung, false:Abnormale Beendigung
*/
private boolean processExec(List<String> command) {
//Verarbeitungsergebnis
boolean result = false;
try {
ProcessBuilder processBuilder = new ProcessBuilder(command);
Process Process = processBuilder.start();
//Warten Sie, bis der Vorgang normal endet
if (Process.waitFor() == 0) {
result = true;
log.info("Process Success: " + command.toString());
} else {
log.warn("Process Failed: " + command.toString());
}
//Standardausgabe
String strInput;
BufferedReader ipbr = new BufferedReader(new InputStreamReader(Process.getInputStream()));
while((strInput = ipbr.readLine()) != null) {
log.info(strInput);
}
ipbr.close();
//Fehlerausgabe
String strErr;
BufferedReader erbr = new BufferedReader(new InputStreamReader(Process.getErrorStream()));
while((strErr = erbr.readLine()) != null) {
log.info(strErr);
}
erbr.close();
//InputStream im Hintergrund nach Verwendung von ProcessBuilder, OutputStream,ErrorStream wird geöffnet.
//Schließen Sie alle Streams, um zu vermeiden, dass Ihnen die Ressourcen ausgehen.
Process.getInputStream().close();
Process.getOutputStream().close();
Process.getErrorStream().close();
} catch (InterruptedException | IOException e) {
//TODO automatisch generierter Fangblock
e.printStackTrace();
}
return result;
}
/**
*Schließen Sie die Zeichenfolge in doppelte Anführungszeichen ein.
*
* @param str string
* @return Zeichenfolge in doppelten Anführungszeichen
*/
private String includeDoubleQuotes(String str) {
return "\"" + str + "\"";
}
Methode: In includeDoubleQuotes wird der Pfad der Zertifikatdatei in "" eingeschlossen und der Befehl von der Java-Anwendung ausgeführt
keytool -importkeystore -keystore "/.../XXXX.keystore" -srckeystore "/.../XXXX.p12" -srcstoretype PKCS12 -srcstorepass root -deststorepass changeit
Scheint nicht normal ausgeführt worden zu sein. Es funktionierte korrekt, indem die Funktion ausgeschlossen wurde, die "" "hinzugefügt hat.
Die Entwicklungsumgebung war Windows, und der Speicherort des Zertifikats befand sich unter Programme. Der Dateipfad enthält ein Leerzeichen mit halber Breite, und der Befehl konnte nur normal ausgeführt werden, wenn der Dateipfad des Zertifikats in "" eingeschlossen war. Daher habe ich versucht, die Funktion zu beißen und "" hinzuzufügen.
Sie müssen bei einer solchen Verarbeitung des externen Prozessausführungssystems vorsichtig sein. Beispielsweise kann es gefährlich sein, wenn Sie in Windows keine virtuelle Linux-Umgebung erstellen, dort bereitstellen und den Vorgang überprüfen. .. ..
Recommended Posts