无效的密钥库格式:java.io.IOException:无效的密钥库格式

Posted

技术标签:

【中文标题】无效的密钥库格式:java.io.IOException:无效的密钥库格式【英文标题】:Invalid keystore format: java.io.IOException: Invalid keystore format 【发布时间】:2018-07-06 11:34:26 【问题描述】:

我已经从下面的命令生成了证书

Openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"

然后在客户端机器中像这样导入

keytool -import -file C:\Code_Base\Certificates\NGINX_150\tls.crt -storepass changeit -keystore "C:\Program Files\Java\jdk1.8.0_152\jre\lib\security\cacerts" -alias nginxsvc

并在 Jboss 服务器的 Standalone.xml 文件中添加

<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" enable-lookups="false" secure="true">
                <ssl name="ssl" password="changeit" certificate-key-file="C:\Code_Base\Certificates\NGINX_150\tls.key"/>
</connector> 

但是当服务器启动时我得到了

11:12:17,279 错误 [org.apache.tomcat.util](MSC 服务线程 1-3) JBWEB003003:无法使用路径加载密钥库类型 JKS C:\Code_Base\Certificates\NGINX_150\tls.key 由于无效的密钥库 格式:java.io.IOException:无效的密钥库格式 sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:658) [rt.jar:1.8.0_152] 在 sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:56) [rt.jar:1.8.0_152] 在 sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224) [rt.jar:1.8.0_152] 在 sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:70) [rt.jar:1.8.0_152] 在 java.security.KeyStore.load(KeyStore.java:1445) [rt.jar:1.8.0_152] 在 org.apache.tomcat.util.net.jsse.JSSESocketFactory.getStore(JSSESocketFactory.java:350) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeystore(JSSESocketFactory.java:265) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeyManagers(JSSESocketFactory.java:480) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:417) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.tomcat.util.net.jsse.JSSESocketFactory.createSocket(JSSESocketFactory.java:180) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:973) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.coyote.http11.Http11Protocol.init(Http11Protocol.java:174) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.connector.Connector.init(Connector.java:986) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.jboss.as.web.WebConnectorService.start(WebConnectorService.java:318) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21] 在 org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1980) [jboss-msc-1.1.5.Final-redhat-1.jar:1.1.5.Final-redhat-1] 在 org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1913) [jboss-msc-1.1.5.Final-redhat-1.jar:1.1.5.Final-redhat-1] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [rt.jar:1.8.0_152] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [rt.jar:1.8.0_152] 在 java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_152]

11:12:17,283 错误 [org.apache.coyote.http11.Http11Protocol] (MSC 服务线程 1-3) JBWEB003043:初始化端点时出错: java.io.IOException:无效的密钥库格式 sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:658) [rt.jar:1.8.0_152] 在 sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:56) [rt.jar:1.8.0_152] 在 sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224) [rt.jar:1.8.0_152] 在 sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:70) [rt.jar:1.8.0_152] 在 java.security.KeyStore.load(KeyStore.java:1445) [rt.jar:1.8.0_152] 在 org.apache.tomcat.util.net.jsse.JSSESocketFactory.getStore(JSSESocketFactory.java:350) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeystore(JSSESocketFactory.java:265) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeyManagers(JSSESocketFactory.java:480) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:417) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.tomcat.util.net.jsse.JSSESocketFactory.createSocket(JSSESocketFactory.java:180) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:973) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.coyote.http11.Http11Protocol.init(Http11Protocol.java:174) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.apache.catalina.connector.Connector.init(Connector.java:986) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 在 org.jboss.as.web.WebConnectorService.start(WebConnectorService.java:318) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21] 在 org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1980) [jboss-msc-1.1.5.Final-redhat-1.jar:1.1.5.Final-redhat-1] 在 org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1913) [jboss-msc-1.1.5.Final-redhat-1.jar:1.1.5.Final-redhat-1] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [rt.jar:1.8.0_152] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [rt.jar:1.8.0_152] 在 java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_152]

11:12:17,289 信息 [org.apache.coyote.http11.Http11Protocol] (MSC 服务线程 1-2) JBWEB003001: Coyote HTTP/1.1 正在初始化: http-/0.0.0.0:8080 11:12:17,297 信息 [org.apache.coyote.http11.Http11Protocol](MSC服务线程1-2) JBWEB003000:Coyote HTTP/1.1 开始于:http-/0.0.0.0:8080 11:12:17,311 错误 [org.jboss.msc.service.fail](MSC 服务线程 1-3)MSC000001:启动服务jboss.web.connector.https失败: 服务中的 org.jboss.msc.service.StartException jboss.web.connector.https:JBAS018007:启动 Web 连接器时出错 在 org.jboss.as.web.WebConnectorService.start(WebConnectorService.java:393) 在 org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1980) [jboss-msc-1.1.5.Final-redhat-1.jar:1.1.5.Final-redhat-1] 在 org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1913) [jboss-msc-1.1.5.Final-redhat-1.jar:1.1.5.Final-redhat-1] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [rt.jar:1.8.0_152] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [rt.jar:1.8.0_152] 在 java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_152] 原因:LifecycleException:JBWEB000023: 协议处理程序初始化失败 org.apache.catalina.connector.Connector.init(Connector.java:989) 在 org.jboss.as.web.WebConnectorService.start(WebConnectorService.java:318) ... 5 更多

【问题讨论】:

java.io.IOException: Invalid keystore format using Tomcat server、Tomcat 7 and invalid keystore format 和朋友们 【参考方案1】:

需要考虑的一种可能性是密钥库类型不匹配。

您可以按如下方式检查现有密钥库的密钥库类型:

 keytool -list -keystore <path/to/keystore>

这应该在输出中显示 Keystore 类型值,如

密钥库类型:PKCS12

这可能与预期的默认密钥库类型(JKS)不同

如果是这样,请在您的 Tomcat 服务器配置中使用适当的 keystoreType 属性来匹配您的密钥库

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS"
           keystoreType="PKCS12"
           keystoreFile="path/to/keystore" keystorePass="changeit" />

【讨论】:

【参考方案2】:

使用存储类型参数运行 keytool:

"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA -storetype JKS

【讨论】:

以上是关于无效的密钥库格式:java.io.IOException:无效的密钥库格式的主要内容,如果未能解决你的问题,请参考以下文章

PhoneGap Android - 在 Ubuntu 下生成的密钥库格式无效

Java:通过代码生成时,密钥库格式无效

Mac OS Flutter 构建 appbundle 失败:密钥库格式无效

无法启动嵌入式 Tomcat 服务器 - 无效的密钥库格式

java.io.IOException:无效的密钥库格式

React Native:错误:[消息/未知] java.io.IOException:java.util.concurrent.ExecutionException:java.io.IOExcept