在 Java 密钥库中导入私钥/公共证书对

2022-08-31 12:58:57

我使用以下步骤创建了一个新的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并导入带有公钥和私钥的证书?


答案 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 证书的证书链。


答案 2

密钥库需要密钥库文件。该类需要一个 .但是,如果您提供 null(而不是实例),那么将装入一个空密钥库。创建密钥库后,可以使用 验证其完整性。KeyStoreFileInputStreamFileInputStreamkeytool

以下代码创建一个密码为空的空密钥库

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

拥有密钥库后,导入证书就非常简单。请查看此链接以获取示例代码。