我有两个服务器
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中管理两个密钥?
答案 0 :(得分:2)
密钥库中有多个密钥,默认情况下,Tomcat只会尝试读取找到的第一个密钥。
您需要使用keyAlias
中<Connector>
上的server.xml
参数来覆盖此行为。来自the documentation:
用于密钥库中的服务器密钥和证书的别名。如果未指定,将使用从密钥库读取的第一个密钥。从密钥库读取密钥的顺序取决于实现。可能不是按照添加密钥的顺序从密钥库读取密钥的情况。如果密钥库中存在多个密钥,则强烈建议配置keyAlias以确保使用正确的密钥。