Der Dateipfad wird nicht erkannt, wenn ein externer Befehl von einer Java-App ausgeführt wird

Beachten Sie, dass ich beim Implementieren der XML-Signatur in Java stecken geblieben bin.

Führen Sie den Befehl keytool -import keystore in der Java-App aus

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 + "\""; 
    }

[Ursache] Der Pfad der Zertifikatdatei wurde in "" "eingeschlossen.

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

Der Dateipfad wird nicht erkannt, wenn ein externer Befehl von einer Java-App ausgeführt wird
[Nicht gelöst] Eine Ausnahme tritt auf, wenn eine SSH-Verbindung mit JSch aus einer Java 6-App ausgeführt wird.
Beim Aufrufen von println usw. aus einer externen Java-Klassendatei in Processing
Wenn eine mit dem Atom-Editor erstellte Java-Datei bei der Ausführung an der Eingabeaufforderung verstümmelt wird
Führen Sie eine Batchdatei von Java aus
Greifen Sie über eine Java-Anwendung auf Teradata zu
Java Calendar ist kein Singleton.
Wenn Sie sshpass von Java mit Shell usw. aufrufen, scheint es notwendig zu sein, einen Pfad zu haben.
Obwohl der Pfad der Eigenschaftendatei in der Option -cp angegeben ist, wird er nicht als Klassenpfad erkannt.
Ursache ist nicht sichtbar, wenn Methoden anderer Klassen in Java aufgerufen werden
Stellen Sie über eine Java-Anwendung eine Verbindung zu Aurora (MySQL) her
[Java] Ruft Werte zufällig aus einem Array ab
Wenn ich die Datei mit der Klasse # getResource aus der JAR-Datei aufrufe, wird sie nicht gefunden und ist ein beschissenes Memorandum
[Ruby] Wenn eine rb-Datei ausgeführt wird, wenn Rails / Sinatra nicht verwendet wird, ärgert sich i18n über "en ist kein gültiges Gebietsschema (I18n :: InvalidLocale)".
[Ruby on Rails] Wenn der Befehl heroku ausgeführt wird, wird der Befehl bash: heroku: nicht gefunden angezeigt. [Rails Tutorial]
So springen Sie von Eclipse Java zu einer SQL-Datei
[Java] So extrahieren Sie den Dateinamen aus dem Pfad
Laden Sie ein externes Glas aus dem Spring Boot-Fettglas
Java11: Führen Sie Java-Code unverändert in einer einzelnen Datei aus