Le chemin du fichier n'est pas reconnu lors de l'exécution d'une commande externe à partir d'une application Java

Notez que je suis resté bloqué lorsque j'ai implémenté la signature XML en Java.

Exécuter la commande keytool -import keystore à partir de l'application 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 + "\""; 
    }

[Cause] Le chemin du fichier de certificat était entre "" ".

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

Le chemin du fichier n'est pas reconnu lors de l'exécution d'une commande externe à partir d'une application Java
[Non résolu] Une exception se produit lorsqu'une connexion SSH est exécutée à l'aide de JSch à partir d'une application Java 6.
Lors de l'appel de println etc. à partir d'un fichier de classe Java externe en traitement
Lorsqu'un fichier Java créé avec l'éditeur Atom est déformé lorsqu'il est exécuté à l'invite de commande
Exécuter le fichier de commandes à partir de Java
Accéder à Teradata depuis une application Java
Le calendrier Java n'est pas un singleton.
Lors de l'appel de sshpass depuis Java avec shell etc., il semble qu'il soit nécessaire d'avoir un chemin.
Même si le chemin du fichier de propriétés est spécifié dans l'option -cp, il n'est pas reconnu comme chemin de classe.
La cause n'est pas visible lors de l'appel de méthodes d'autres classes en java
Connectez-vous à Aurora (MySQL) depuis une application Java
[Java] Récupère des valeurs de manière aléatoire dans un tableau
Lorsque j'appelle le fichier avec la classe # getResource à partir du fichier jar, il devient Not Found et c'est un mémorandum merdique
[Ruby] Lors de l'exécution d'un fichier rb lorsque Rails / Sinatra n'est pas utilisé, i18n se fâche avec ʻen n'est pas une locale valide (I18n :: InvalidLocale) '
[Ruby on rails] Lors de l'exécution de la commande heroku, bash: heroku: command not found s'affiche. [Tutoriel Rails]
Comment passer d'Eclipse Java à un fichier SQL
[Java] Comment extraire le nom du fichier du chemin
Chargez un pot externe à partir du pot de graisse Spring Boot
Java11: exécuter le code Java dans un seul fichier tel quel