Как запустить команду openssl из JAVA, используя Runtime? - PullRequest
1 голос
/ 06 апреля 2020

Я хочу прочитать закрытый и открытый ключ c, сгенерированный с помощью PuttyGen, для которого я использовал openssl для преобразования их в формат DER.

String[] execStr = {"openssl","pkcs8", "-topk8", "-inform", "PEM", "-outform","DER", "-in", "src\\srcData\\openssh1\\privateKey.pem","-out", "src\\srcData\\openssh1\\privateKey.der" };

File execDir = new File("C:\\openssl-1.0.2d-fips-2.0.10\\bin");

Runtime.getRuntime().exec(execStr,null,execDir);

Но я получаю эту ошибку:

Exception in thread "main" java.io.IOException: Cannot run program "openssl" (in directory "C:\openssl-1.0.2d-fips-2.0.10\bin"): CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1059)
    at java.lang.Runtime.exec(Runtime.java:631)
    at PrivateKeyReader.get(PrivateKeyReader.java:21)
    at Test1.main(Test1.java:50)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:455)
    at java.lang.ProcessImpl.start(ProcessImpl.java:151)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1040)
    ... 3 more

Здесь я не могу выяснить точную проблему, пожалуйста, дайте мне знать, если кто-то знает.

1 Ответ

0 голосов
/ 07 апреля 2020

Я так понимаю, вы загрузили Windows версию openssl-1.0.2d-fips-2.0.10. Исполняемый файл, содержащийся в папке bin, называется openssl.exe, а не openssl. По этой причине вы получаете ошибку The system cannot find the file specified. Поэтому ваш execStr должен быть String[] execStr = {"openssl.exe", ...

. Чтобы предотвратить эту проблему в будущем, вы можете сделать так, чтобы Windows Explorer отображал полное имя openssl.exe вместо openssl, используя инструкции здесь .

Также обратите внимание, что когда вы используете C:\\openssl-1.0.2d-fips-2.0.10\\bin в качестве execDir, путь src\\srcData\\openssh1\\privateKey.pem интерпретируется относительно execDir. Поэтому вы должны превратить его в абсолютный путь, используя:

File inputFile = new File("src\\srcData\\openssh1\\privateKey.pem");

String[] execStr = {"openssl.exe ", ..., "-in", inputFile.getCanonicalPath(), ... };

То же самое относится и к выходному файлу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...