如何在Java密钥库中导入现有的X.509证书和私钥以在SSL中使用?

2022-08-31 05:20:19

我在ActiveMQ配置中有这个:

<sslContext>
        <sslContext keyStore="file:/home/alex/work/amq/broker.ks"  
 keyStorePassword="password" trustStore="file:${activemq.base}/conf/broker.ts" 
 trustStorePassword="password"/>
</sslContext>

我有一对X.509证书和一个密钥文件。

如何导入这两个以在 SSL 和 SSL+踏板连接器中使用它们?所有的例子,我可以谷歌总是自己生成密钥,但我已经有一个密钥。

我试过

keytool -import  -keystore ./broker.ks -file mycert.crt

但这只导入证书而不是密钥文件,并导致

2009-05-25 13:16:24,270 [localhost:61612] ERROR TransportConnector - Could not accept connection : No available certificate or key corresponds to the SSL cipher suites which are enabled.

我尝试将证书和密钥连接起来,但得到了相同的结果。

如何导入密钥?


答案 1

我使用了以下两个步骤,这是我在其他答案中链接的评论/帖子中找到的:

步骤 1:将 x.509 证书和密钥转换为 pkcs12 文件

openssl pkcs12 -export -in server.crt -inkey server.key \
               -out server.p12 -name [some-alias] \
               -CAfile ca.crt -caname root

注意:确保在 pkcs12 文件上输入密码 - 否则当您尝试导入它时,将收到空指针异常。(以防其他人有这种头痛)。(谢谢笑!)

注2:您可能希望添加保留完整证书链的选项。(谢谢马夫巴-chain)

步骤二:将 pkcs12 文件转换为 Java 密钥库

keytool -importkeystore \
        -deststorepass [changeit] -destkeypass [changeit] -destkeystore server.keystore \
        -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass some-password \
        -alias [some-alias]

完成

可选步骤零:创建自签名证书

openssl genrsa -out server.key 2048
openssl req -new -out server.csr -key server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

常见问题解答:我收到错误 IOException:密钥库密码不正确

如果您使用的是 OpenSSL 3.0 和比 Java8u302 更新的 JDK,则会出现以下错误:

keytool error: java.io.IOException: keystore password was incorrect

您可能会陷入 openssl 中的更改 pf 默认密码。以下堆栈溢出答案提供了答案。也许感谢托马斯

干杯!


答案 2

Java 6 中的 Keytool 确实具有此功能:使用 keytool 将私钥导入 Java 密钥库

以下是该帖子的基本详细信息。

  1. 使用 OpenSSL 将现有证书转换为 PKCS12。询问时需要密码,否则第二步将投诉。

    openssl pkcs12 -export -in [my_certificate.crt] -inkey [my_key.key] -out [keystore.p12] -name [new_alias] -CAfile [my_ca_bundle.crt] -caname root
    
  2. 将 PKCS12 转换为 Java 密钥库文件。

    keytool -importkeystore -deststorepass [new_keystore_pass] -destkeypass [new_key_pass] -destkeystore [keystore.jks] -srckeystore [keystore.p12] -srcstoretype PKCS12 -srcstorepass [pass_used_in_p12_keystore] -alias [alias_used_in_p12_keystore]