2015-06-07 145 views
1

我正在嘗試使用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部分,它仍然以相同的錯誤終止,所以我用完了想法。

回答

0

我成功解決了這個問題,方法是提供一個String[]並使用getRuntime().exec()方法。
我用:

// Generate key for keystore 
String userStore = username + "KeyStore.jks"; 
String userDetails = "CN=" + username 
     + ", OU=FCT, O=UNL, L=Unknown, ST=Unknown, C=PT"; 
String certValidity = "" + 365; 
String keytoolArgs[] = { "keytool", "-genkeypair", "-alias", 
     username, "-keystore", "Client/" + userStore, 
     "-keypass", certpassword, "-storepass", certpassword, 
     "-keyalg", "RSA", "-keysize", "2048", "-dname", 
     userDetails, "-validity", certValidity }; 
System.out.println(Arrays.asList(keytoolArgs)); 
Process p1 = Runtime.getRuntime().exec(keytoolArgs); 
p1.waitFor(); 

這使我能夠創建到一個程序,它在我的項目,它更容易在一次建立多個證書通過動態參數的關鍵。

0

請注意,在ProcessBuilder中創建命令數組時,您需要將每個非空白參數指定爲單獨的命令對象。參數中不允許有空格。

例如,這將不起作用

command.append(" -alias " + username); 

這應寫爲(也值應該是一個單獨的參數)

command.append("-alias"); 
command.append(username); 

請使用此代碼

StringBuilder command = new StringBuilder(); 
command.append("keytool"); 
command.append("-genkeypair"); 
command.append("-keystore"); 
command.append(username); 
command.append("store.jks"); 
command.append("-alias"); 
command.append(username); 
command.append("-keyalg"); 
command.append("RSA"); 
command.append("-keysize"); 
command.append("2048"); 
command.append("-dname"); 
command.append("CN="+username+",OU=FCT,O=UNL,L=Unknown,ST=Unknown,C=PT"); 
command.append("-validity"); 
command.append("365"); 
command.append("-keypass"); 
command.append(certpassword); 
command.append("-storepass"); 
command.append(certpassword); 
command.append("-noprompt"); 
ProcessBuilder pb = new ProcessBuilder(command.toString()); 
+0

嘗試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); –