keytool 命令在命令行上成功但不是通过 ProcessBuilder
keytool command successful on command line but not via ProcessBuilder
我正在尝试使用 keytool 以编程方式生成证书。为此,我首先使用以下命令生成密钥库:
-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
部分,它仍然以同样的错误终止,所以我 运行 没有想法。
我通过提供 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();
这使我能够创建一个带有传递给程序的动态参数的密钥,这在我的项目中使得一次构建多个证书变得更加容易。
请注意,在 ProcessBuilder 中创建命令数组时,您需要将每个非白色 space 参数指定为单独的命令对象。参数中不允许使用白色 space。
例如,这将不起作用
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());
我正在尝试使用 keytool 以编程方式生成证书。为此,我首先使用以下命令生成密钥库:
-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
部分,它仍然以同样的错误终止,所以我 运行 没有想法。
我通过提供 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();
这使我能够创建一个带有传递给程序的动态参数的密钥,这在我的项目中使得一次构建多个证书变得更加容易。
请注意,在 ProcessBuilder 中创建命令数组时,您需要将每个非白色 space 参数指定为单独的命令对象。参数中不允许使用白色 space。
例如,这将不起作用
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());