如何管理JKS中的两个密钥

时间:2016-02-05 12:28:46

标签: java

我有两个服务器

1. Tomcat as Application Server
2. Openfire as Chat Server

现在我需要在两台服务器上通过SSL / TSL(https协议)管理流量。这就是我为两个服务器创建密钥库文件和自签名证书的原因:

用于Tomcat的别名tomcat(app server)

keytool -genkey -alias tomcat -keyalg RSA

和别名openfire for Openfire(xmpp服务器)

keytool -genkey -alias openfire -keyalg RSA 

两个别名都有自己唯一的密码,密钥库文件的密码与tomcat相同。

但是当我重新启动tomcat服务器时,我收到错误

SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-nio-8443"]
java.security.UnrecoverableKeyException: Cannot recover key
    at sun.security.provider.KeyProtector.recover(KeyProtector.java:328)
    at sun.security.provider.JavaKeyStore.engineGetKey(JavaKeyStore.java:138)
    at sun.security.provider.JavaKeyStore$JKS.engineGetKey(JavaKeyStore.java:55)
    at java.security.KeyStore.getKey(KeyStore.java:804)

当我在密钥库文件中添加另一个别名为openfire时出现此错误。 并且通过keytool -delete -alias openfire删除别名后,tomcat正常重启并且不会导致任何错误。

这里我无法识别如何在Keystore中管理两个密钥?

1 个答案:

答案 0 :(得分:2)

密钥库中有多个密钥,默认情况下,Tomcat只会尝试读取找到的第一个密钥。

您需要使用keyAlias<Connector>上的server.xml参数来覆盖此行为。来自the documentation

  

用于密钥库中的服务器密钥和证书的别名。如果未指定,将使用从密钥库读取的第一个密钥。从密钥库读取密钥的顺序取决于实现。可能不是按照添加密钥的顺序从密钥库读取密钥的情况。如果密钥库中存在多个密钥,则强烈建议配置keyAlias以确保使用正确的密钥。