我正在嘗試使用keytool以編程方式生成證書。爲了做到這一點,我使用下面的命令首先生成一個密鑰:keytool命令在命令行上成功,但不通過ProcessBuilder
-genkeypair -alias alias -keyalg RSA -keysize 2048 -dname "CN=name,OU=ou,O=o,c=pt" -validity 365 -keystore teststore.jks -keypass testpass -storepass testpass -noprompt
在命令行這個成功完成,創建文件teststore.jks
不要求用戶輸入。我需要這個,因爲我將使用來自ProcessBuilder
實例的此命令。
我用下面的代碼來生成相同的命令:
StringBuilder command = new StringBuilder();
command.append("keytool ");
command.append("-genkeypair");
command.append(" -keystore " + username + "store.jks");
command.append(" -alias " + username);
command.append(" -keyalg RSA");
command.append(" -keysize 2048");
command.append(" -dname \"CN="+username+", OU=FCT, O=UNL, L=Unknown, ST=Unknown, C=PT\"");
command.append(" -validity " + 365);
command.append(" -keypass " + certpassword);
command.append(" -storepass " + certpassword);
command.append(" -noprompt");
ProcessBuilder pb = new ProcessBuilder(command.toString());
pb.inheritIO();
pb.start();
當我運行程序時,我得到下面的輸出:
java.io.IOException: Cannot run program "keytool -genkeypair -keystore teststore.jks -alias alias -keyalg RSA -keysize 2048 -dname "CN=name, OU=ou, O=o, C=pt" -validity 365 -keypass ssc1415 -storepass ssc1415 -noprompt": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at UserRegistry.main(UserRegistry.java:29)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:185)
at java.lang.ProcessImpl.start(ProcessImpl.java:134)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 1 more
由於我使用pb.inheritIO()
我註釋掉-dname
和-noprompt
部分,它仍然以相同的錯誤終止,所以我用完了想法。
嘗試command.toString()之後出現的命令字符串不包含ne空格。所以我們必須做額外的command.append(「」);在每個command.append(「keytool」);之後。另外StringBuilder刪除引號。其他做同樣的選擇是使用字符串數組。 String []命令= {cmdPath,「-genkeypair」,「 - keyalg」,「RSA」,「 - keysize」,「2048」,「-keystore」,用戶名,「-alias」,userName,「-dname」 「CN =」+用戶名+「,OU = FCT,O = UNL,L =未知,ST =未知,C = PT」,「有效性」,「365」,「 - keypass」,passwd,「-storepass」, passwd文件, 「 - NOPROMPT」}; ProcessBuilder probuilder = new ProcessBuilder(commands); –