Notez que je suis resté bloqué lorsque j'ai implémenté la signature XML en Java.
Mais pas importé. .. .. Les trois méthodes suivantes sont liées au moment de l'exécution et sont exécutées dans l'ordre de importProcessExec ⇒ getImportCommand ⇒ processExec.
sample.java
/**
*Exécutez la commande d'importation de certificat.
*
* @param fichier de certificat certFilePath
* @param destAlias Nom distinctif
* @param keyStoreFilePath Fichier Keystore
* @param certificatePass Mot de passe du certificat
* @param keyStorePass Mot de passe Keystore
* @return true:Réussite, false:Terminaison anormale
* @throws InterruptedException
*/
private boolean importProcessExec(File keyStoreFile, String destAlias, File certFile,
String certificatePass,
String keyStorePass) throws InterruptedException {
//Commande pour importer le certificat
List<String> command = getImportCommand(keyStoreFile, destAlias, certFile, certificatePass,
keyStorePass);
//Exécuter la commande d'importation
return processExec(command);
}
/**
*Obtenez la commande d'importation de certificat.
*
* @param fichier de certificat certFilePath
* @param destAlias Nom distinctif
* @param keyStoreFilePath Fichier Keystore
* @param certificatePass Mot de passe du certificat
* @param keyStorePass Mot de passe Keystore
* @return commande d'importation resultList
*/
private List<String> getImportCommand(File keyStoreFile, String destAlias, File certFile,
String certificatePass, String keyStorePass) {
//Commande pour importer le certificat
String command = "keytool -importkeystore -keystore %keyStoreFilePath% -srckeystore %certFilePath% -srcstoretype PKCS12 -srcalias 1 -destalias %destalias% -srcstorepass %certificatePass% -deststorepass %keyStorePass%";
//Commande Split en tableau de chaînes
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;
}
/**
*Exécutez un processus externe.
*
* @commande param Contenu de la commande
* @return true:Réussite, false:Terminaison anormale
*/
private boolean processExec(List<String> command) {
//Résultat du traitement
boolean result = false;
try {
ProcessBuilder processBuilder = new ProcessBuilder(command);
Process Process = processBuilder.start();
//Attendez que le processus se termine normalement
if (Process.waitFor() == 0) {
result = true;
log.info("Process Success: " + command.toString());
} else {
log.warn("Process Failed: " + command.toString());
}
//Sortie standard
String strInput;
BufferedReader ipbr = new BufferedReader(new InputStreamReader(Process.getInputStream()));
while((strInput = ipbr.readLine()) != null) {
log.info(strInput);
}
ipbr.close();
//Sortie d'erreur
String strErr;
BufferedReader erbr = new BufferedReader(new InputStreamReader(Process.getErrorStream()));
while((strErr = erbr.readLine()) != null) {
log.info(strErr);
}
erbr.close();
//InputStream en arrière-plan après l'utilisation de ProcessBuilder, OutputStream,ErrorStream est ouvert.
//Fermez tous les flux pour éviter de manquer de ressources.
Process.getInputStream().close();
Process.getOutputStream().close();
Process.getErrorStream().close();
} catch (InterruptedException | IOException e) {
//Bloc de capture généré automatiquement TODO
e.printStackTrace();
}
return result;
}
/**
*Mettez la chaîne entre guillemets.
*
* @param str string
* @return Chaîne de caractères entre guillemets
*/
private String includeDoubleQuotes(String str) {
return "\"" + str + "\"";
}
Méthode: dans includeDoubleQuotes, le chemin du fichier de certificat est placé entre "" "et la commande est exécutée à partir de l'application Java
keytool -importkeystore -keystore "/.../XXXX.keystore" -srckeystore "/.../XXXX.p12" -srcstoretype PKCS12 -srcstorepass root -deststorepass changeit
Ne semble pas fonctionner correctement. Il a fonctionné correctement en excluant la fonction qui a ajouté "" ".
L'environnement de développement était Windows et l'emplacement du certificat était sous Program Files. Étant donné que le chemin du fichier contient un espace demi-largeur et que la commande ne peut pas être exécutée normalement à moins que le chemin du fichier du certificat ne soit compris entre "" ", la fonction a été mordue et" "" a été ajouté.
Vous devez faire attention à ce type de traitement du système d'exécution de processus externe. Par exemple, il peut être dangereux de ne pas créer un environnement virtuel de Linux dans Windows, de le déployer là-bas et de vérifier le fonctionnement. .. ..
Recommended Posts