java - Tomcat 失败并出现 UnrecoverableKeyException : Cannot recover key

标签 java tomcat

我在服务器上运行 Apache Tomcat/7.0.68,我正在尝试为其自动更新证书。

证书和私钥是通过 Java 的 keytool 从 PKCS#12 文件(Powershell 脚本摘录)导入的:

& $keytool -importkeystore -srckeystore $certfile -srcstoretype PKCS12 -srcstorepass $srcpassword -srcalias tomcat -keystore $keystore -deststorepass $dstpassword -destalias teamcity -destkeypass $dstpassword -noprompt

当我重新启动 Tomcat 时,它吐出以下日志行:

INFO: Initializing ProtocolHandler ["http-nio-443"]
jul. 14, 2017 5:03:31 PM org.apache.coyote.AbstractProtocol init
SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-nio-443"]
java.security.UnrecoverableKeyException: Cannot recover key
  at sun.security.provider.KeyProtector.recover(KeyProtector.java:328)
  at sun.security.provider.JavaKeyStore.engineGetKey(JavaKeyStore.java:146)
  at sun.security.provider.JavaKeyStore$JKS.engineGetKey(JavaKeyStore.java:56)
  at sun.security.provider.KeyStoreDelegator.engineGetKey(KeyStoreDelegator.java:96)
  at sun.security.provider.JavaKeyStore$DualFormatJKS.engineGetKey(JavaKeyStore.java:70)
  at java.security.KeyStore.getKey(KeyStore.java:1023)
  at sun.security.ssl.SunX509KeyManagerImpl.<init>(SunX509KeyManagerImpl.java:133)
  at sun.security.ssl.KeyManagerFactoryImpl$SunX509.engineInit(KeyManagerFactoryImpl.java:70)
  at javax.net.ssl.KeyManagerFactory.init(KeyManagerFactory.java:256)
  at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeyManagers(JSSESocketFactory.java:608)
  at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeyManagers(JSSESocketFactory.java:537)
  at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:495)
  at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:650)
  at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:434)
  at org.apache.coyote.http11.AbstractHttp11JsseProtocol.init(AbstractHttp11JsseProtocol.java:119)
  at org.apache.catalina.connector.Connector.initInternal(Connector.java:978)
  at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
  at org.apache.catalina.core.StandardService.initInternal(StandardService.java:560)
  at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
  at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:820)
  at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
  at org.apache.catalina.startup.Catalina.load(Catalina.java:642)
  at org.apache.catalina.startup.Catalina.load(Catalina.java:667)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:497)
  at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:253)
  at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:427)

但是当我尝试通过 keytool 更改密码时,它可以正常读取条目并更改密码。

PS:我确保条目的密码与商店的密码相同,因为至少某些版本的 Tomcat 需要这个。

最佳答案

终于解决了。事实证明,在 keystore 中使用与 keystore 不同的密码的完全不相关的 key 会破坏 Tomcat,详见 this ancient bug report。 !

关于java - Tomcat 失败并出现 UnrecoverableKeyException : Cannot recover key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45107095/

相关文章:

spring - Tomcat:正在使用多个 log4j.xml 配置

java - 无法使用 Tomcat 作为服务在前台运行 cmd

javascript - 我对javascript所做的更改未反射(reflect)在JSP项目中

java - 从文本文件中仅提取带撇号的单词

java - 用于导入 android.net.http.RequestQueue 的包;

java - 无法解析 : firebase-analytics failed to resolve:play-service-base

java - 将未导出/未打开的包添加到模块信息的 ModulePackages 的用例是什么?

maven - Log4j 冲突 - 提供的容器和项目级别

java - Doclava - 如何生成版本控制的 xml?

java - 非法参数异常 : A ServletContext is required