2013-12-18 48 views
2

我想通过在我的java脚本中调用keytool来创建一个自签名证书。这里是我的代码的简化版本,其中包括我有的问题:在Linux下使用Runtime.getRuntime()。exec()的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. 由密钥工具生成的证书不被认为是“子进程的输出”,它需要被送入使用getinputstream()父进程,是吗?

  2. 如果是这样,我也试过getinputstream()东西在下面的讨论后,

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

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

  1. 是否有任何其他方式使用java程序创建自签名证书?

我是Java的新手,英语不是我的第一语言。我希望我明确表达了我的问题。

+0

我不确切知道你在尝试什么,但考虑改变你的策略略微:不是调用'exec'来调用keytool二进制文件,而是尝试以编程方式自己调用Keystore创建代码。 http://stackoverflow.com/questions/5312559/how-do-i-programmatically-create-a-new-keystore – Gus

+0

我想要的是以编程方式创建一个自签名证书。我以为我可以使用Runtime.getRuntime.exec()调用keytool,就像下面的文章中讨论的那样。[http://stackoverflow.com/questions/8308148/keytool-usage-with-runtime-getruntime-exec-under-linux ]我尝试了他们的方法,但无法获得证书。 @Hariprasad –

+0

@Gus证书签名对于标准的Java加密API是不可能的。您需要使用第三方库(例如BouncyCastle)来做到这一点。 – Jcs

回答

2

您可以再次尝试不同的方法 - 因为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版本等中存在,等等。

相关问题