在 Java KeyStore 中导入私钥/公钥对 [重复]

Posted

技术标签:

【中文标题】在 Java KeyStore 中导入私钥/公钥对 [重复]【英文标题】:Importing the private-key/public-certificate pair in the Java KeyStore [duplicate] 【发布时间】:2013-07-15 17:47:03 【问题描述】:

我使用以下步骤创建了一个带有一对私钥/公钥的新 Java 密钥库,供具有 TLS 的 Java(内部)服务器使用。请注意证书是自签名的:

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

所以问题是:如何在不使用 GUI 的情况下创建 Java KeyStore 并同时导入带有公钥和私钥的证书?

【问题讨论】:

也许这个“ImportKey”Java 程序可以在没有 GUI 的情况下为您完成这项工作:agentbob.info/agentbob/79-AB.html 如果目标系统是Java,则根本不需要使用OpenSSL,只需keytool即可。例如,请参阅 JSSE 参考指南或 keytool 的工具文档。 【参考方案1】:

使用您的私钥和公共证书,您需要先创建一个 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 证书的证书链。

【讨论】:

***.com/a/8224863/183622 展示了一个更全面的示例,包括 CA 证书和链保存(如果需要) 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 这些命令对我有用【参考方案2】:

密钥库需要一个密钥库文件。 KeyStore 类需要 FileInputStream。但是,如果您提供 null(而不是 FileInputStream 实例)empty keystore will be loaded。创建密钥库后,您可以使用 keytool 验证其完整性。

以下代码使用空密码创建一个空密钥库

  KeyStore ks2 = KeyStore.getInstance("jks");
  ks2.load(null,"".toCharArray());
  FileOutputStream out = new FileOutputStream("C:\\mykeytore.keystore");
  ks2.store(out, "".toCharArray());

一旦你有了密钥库,导入证书就很容易了。签出this link 以获取示例代码。

【讨论】:

无需编写任何代码即可完成此操作。您引用的链接包含重大错误。 @EJB,我在博客上看到了你的评论。我同意不需要编写任何代码来完成此操作。但是,如果必须以编程方式完成? 另外,您对 InpputStream.available() 的观察是正确的,但我看到 FilterInputStream.available() 的文档说 返回对可以读取(或跳过)的字节数的估计) 来自这个输入流 并且没有警告!在示例中(在博客中),DataInputStream.available() 被到处使用,FilterInputStreamDataInputStream 扩展。在这种特殊情况下使用available() 不应该是安全的吗? 请求通过适当的评论支持反对票。匿名投票对任何人都没有帮助。 1.尽管如此,程序化创建仍然是“无 GUI”的选项之一。 2. 部分引用是针对我所说的这个“特殊案例”,我清楚地提到了这一点。

以上是关于在 Java KeyStore 中导入私钥/公钥对 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SSL证书中的keystore是什么

必须引用包含私钥和相应公钥证书链的有效 KeyStore 密钥条目

从jks证书中提取公钥和私钥(jks证书转pem证书)

Java安全(JCA/JSSE):数字证书

keytool工具使用

keytool导出的p12无法导入