在Java KeyStore中导入私钥/公钥证书对

78
我使用以下步骤创建一个带有私钥/公钥对的新Java密钥库,供Java(内部)服务器使用TLS。请注意,证书是自签名的:
1) 使用AES256生成密钥
openssl genrsa -aes256 -out server.key 1024

2) 为CA生成证书请求

openssl req -x509 -sha256 -new -key server.key -out server.csr

3) 生成有效期为10年的自签名证书

openssl x509 -sha256 -days 3652 -in server.csr -signkey server.key -out selfsigned.crt

4) 使用类似KeyStoreExplorer这样的程序,在新的JKS中导入密钥对(私钥和自签名证书)。

这样做是可行的,但我想实现最后一步而不使用GUI。

我知道如何仅导入自签名证书:

// create the keystore and import the public key. THIS WILL NOT IMPORT THE PRIVATE KEY SO THE KEYSTORE CAN'T BE USED ON THE SERVER TO MAKE THE TLS CONNECTION
/usr/java/jdk1.6.0_45/bin/keytool -import -alias myservercert -file server.crt -keystore mykeystore.jks

所以问题是:我如何创建一个Java KeyStore并在不使用GUI的情况下导入既包含公钥又包含私钥的证书?


1
也许这个名为"ImportKey"的Java程序可以在没有图形界面的情况下为您完成工作:http://www.agentbob.info/agentbob/79-AB.html - sk2212
如果目标系统是Java,则完全不需要使用OpenSSL,只需要使用keytool即可。例如,请参阅JSSE参考指南或keytool的工具文档。 - user207421
2个回答

187

使用您的私钥和公共证书,首先需要创建一个PKCS12密钥库,然后将其转换为JKS格式。

# Create PKCS12 keystore from private key and public certificate.
openssl pkcs12 -export -name myservercert -in selfsigned.crt -inkey server.key -out keystore.p12

# Convert PKCS12 keystore into a JKS keystore
keytool -importkeystore -destkeystore mykeystore.jks -srckeystore keystore.p12 -srcstoretype pkcs12 -alias myservercert

要验证JKS的内容,您可以使用以下命令:

keytool -list -v -keystore mykeystore.jks
如果这不是自签名证书,你可能需要按照此步骤导入证书链,以达到可信 CA 证书的级别。

11
https://dev59.com/ZnNA5IYBdhLWcg3wk-6A#8224863 展示了一个更为详细的例子,包括CA证书和链路保留(如果需要) - Michael Renner
  1. openssl pkcs12 -inkey server_private.key -in my_server.crt -export -out intermediate_keys.pkcs12
  2. keytool -importkeystore -srckeystore intermediate_keys.pkcs12 -srcstoretype pkcs12 -destkeystore my_keystore.jks
这些命令对我有效。
- Santhosh

0
一个密钥库需要一个密钥库文件。 KeyStore 类需要一个 FileInputStream。但是,如果您提供 null(而不是 FileInputStream 实例),则会加载 空密钥库。创建密钥库后,可以使用 keytool 验证其完整性。
以下代码创建一个带有空密码的空密钥库。
  KeyStore ks2 = KeyStore.getInstance("jks");
  ks2.load(null,"".toCharArray());
  FileOutputStream out = new FileOutputStream("C:\\mykeytore.keystore");
  ks2.store(out, "".toCharArray());

一旦您拥有密钥库,导入证书非常容易。请查看此链接以获取示例代码。


不需要编写任何代码即可完成此操作。您引用的链接包含重大错误。 - user207421
@EJB,我看到了你在博客上的评论。我同意不需要编写任何代码来完成这个任务。但是,如果必须通过编程实现呢? - Santosh
1
此外,你对 InpputStream.available() 的观察是正确的,但我发现 FilterInputStream.available() 的文档中写道“返回可以从此输入流读取(或跳过)的字节数的估计值”,并没有警告!在博客的示例中,DataInputStream.available() 到处都被使用,并且 DataInputStream 扩展了 FilterInputStream。在这种特定情况下使用 available() 应该是安全的,不是吗? - Santosh
1
请通过适当的评论来撤销您的负评。匿名投票对任何人都没有帮助。 - Santosh
  1. 编程创建是“无 GUI”选项之一,但并非唯一选择。
  2. 部分引用是针对我所谈论的“特定情况”,我已经明确提到了。
- Santosh
  1. “没有GUI”并不意味着“编程创建”。
  2. 除非你能够并且确实提供证据,证明你省略的部分不适用于这个“特定情况”,否则你的错误仍然存在。
  3. 你发布的代码只是创建了一个空的密钥库。它并不是回答这个问题的任何方式。
- user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接