您好我在Java和Spring框架中使用openssl
生成证书和密钥,
以下是我的代码
String[] cmds = new String[4];
cmds[0] = String.format("openssl genrsa -out %s.key 2048", path+name);
cmds[1] = String.format("openssl req -new -key %s.key -out %s.csr", path+name, path+name);
cmds[2] = String.format("openssl x509 -req -in %s.csr -CA %s.pem -CAkey %s.key -CAcreateserial -out %s.crt -days 365 -sha512 -extensions mysection -extfile conf.cnf", path+name, path+rootName, path+rootName, path+name);
cmds[3] = String.format("openssl pkcs12 -export -out %s.pfx -inkey %s.key -in %s.crt", path+name, path+name, path+name);
Runtime r = Runtime.getRuntime();
Process p = null;
try {
p = r.exec(cmds);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
作为回报我得到了关注
java.io.IOException:无法运行程序" openssl genrsa -out /home/lalani/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/api-server/WEB-INF/applications/certificate/Riksof.key 2048":错误= 2,没有这样的文件或目录
请指导我做错了什么?
还请建议我如何在异步任务中运行此Runtime.getRuntime().exec()
?
答案 0 :(得分:2)
Runtime.exec
不会运行一系列命令。它需要一个描述单个命令的数组。
这意味着系统依赖,但通常数组中的第一个元素将是要运行的命令,后续元素描述其参数。例如,如果您想将foo.txt
复制到bar.txt
,则可以:
String[] cmd = { "cp", "foo.txt", "bar.txt" };
p = r.exec(cmd);
因此,您的代码尝试执行的操作是调用名为openssl genrsa -out /home/lalani/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/api-server/WEB-INF/applications/certificate/Riksof.key 2048
的程序。它试图将三个参数传递给该程序,对应于数组的最后三个元素。但是那个程序不存在 - 如果有的话,这将是一个非常奇怪的程序!
要在数组中执行第一个命令,您需要一个类似的数组:
String[] cmd1 = { "openssl", "genrsa", "-out", path + name + ".key", "2048" };
p = r.exec(cmd1);
当然,你也需要为其他三个命令执行此操作。
文本在终端中工作的原因是shell实际占用了行,将其解析为其组件(基本上是通过拆分空格,将引用文本分解),处理第一个令牌(openssl
)作为程序,其余的标记作为其参数。但是该功能是shell的一部分,而不是底层操作系统; Runtime.exec
与操作系统进行对话,因此您需要自己进行拆分。
答案 1 :(得分:1)
Java无法找到程序openssl
。您必须提供openssl
可执行文件的完整路径,或确保openssl
的路径位于Java程序可用的路径中。
答案 2 :(得分:0)
标题为“无法执行Runtime.getRuntime()”的问题,但此处的问题不是无法执行Runtime.getRuntime(),但是在执行p = r.exec(cmds);
时,会抛出IO异常,因为
Cannot run program "openssl genrsa -out /home/lalani/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/api-server/WEB-INF/applications/certificate/Riksof.key 2048": error=2, No such file or directory
答案 3 :(得分:0)
只需将要运行的cmd全路径: 例如:“ node -e index.js” ==>“ / path / to / node -e /path/to/index.js” 它为我修复 就我而言,节点位于PATH中,但我不知道为什么它不起作用