【问题标题】:Use keytool with Runtime.getRuntime().exec() under Linux在 Linux 下使用 keytool 和 Runtime.getRuntime().exec()
【发布时间】:2013-12-18 21:13:40
【问题描述】:

我想通过在我的 java 脚本中调用 keytool 创建一个自签名证书。这是我的代码的简化版本,其中包括我遇到的问题:

    public class Tester {
        public static void main(String[] args) {   
            String[] cmd = {   
                "/bin/sh",  
                "-c",  
                "keytool",  
                "-genkey",   
                "-dname",  
                "\"C=US,CN=CU,L=ABC,O=ABC_Univ,OU=ABC_Pro\"",  
                "-keysize",  
                "1024",  
                "-alias",  
                "testkeypairs",
                "-keyalg",  
                "RSA",  
                "-sigalg",   
                "SHA1withRSA",  
                "-keystore",     
                "testkeystore",  
                "-storepass",  
                "abcdef",  
                "-keypass",  
                "abcdef"  
            }    
            Process testProc = Runtime.getRuntime().exec(cmd);  
}  

我运行它时没有错误。但它没有给我密钥库。我的问题是:

  1. keytool 生成的证书不被视为需要使用getinputstream() 提供给父进程的“子进程的输出”,是吗?

  2. 如果是这样,我还尝试了getinputstream() 的事情,如下文所述,

Keytool usage with Runtime.getRuntime().exec() under Linux

程序卡住了,似乎永远不会停止。

  1. 还有其他方法可以使用 java 程序创建自签名证书吗?

我是 Java 新手,英语不是我的第一语言。我希望我已经清楚地表达了我的问题。

【问题讨论】:

  • 我不确切知道您在尝试什么,但请考虑稍微改变您的策略:与其调用 exec 来调用 keytool 二进制文件,不如尝试以编程方式自己调用 Keystore 创建代码。 stackoverflow.com/questions/5312559/…
  • 我想要的是以编程方式创建一个自签名证书。我以为我可以使用 Runtime.getRuntime.exec() 调用 keytool,就像在下面的帖子中讨论的那样。[stackoverflow.com/questions/8308148/… 我尝试了他们的方法,但无法获得证书。 @Hariprasad
  • @Gus 证书签名不适用于标准 java 加密 API。您需要使用第 3 方库(例如 BouncyCastle)来执行此操作。
  • 文件是否可能已创建,但位于与您预期不同的目录中?尝试为 -keystore 参数指定完整路径,看看会发生什么。
  • 您可能需要调用 testProc.waitFor();并且还消耗 testProc.getInputStream();和 testProc.getErrorStream();类似 while(stream.read()!=-1) {};

标签: java runtime.exec keytool


【解决方案1】:

您可以再次尝试不同的方法 - 因为keytool 是用 Java 编写的并且它是随 JDK 一起提供的,所以您实际上可以直接实例化 keytool 类,就像在 this answer 中一样。这种方法可以让您在您选择的 JKS 文件中生成一个自签名证书,但它不会让您以编程方式访问生成的证书。

请注意,在 Java 7 下,您需要执行 new sun.security.tools.KeyTool(),但在 Java 8 下,该类已被移动,您将需要执行 new sun.security.tools.keytool.Main。当然它只适用于 Oracle JDK,API 是内部的,不保证在任何未来的 Java 版本等中都存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2015-08-28
    相关资源
    最近更新 更多