Spring 嵌入式 Boot 2.1 Tomcat - 密钥库密码不正确
Spring Boot 2.1 embedded Tomcat - keystore password was incorrect
更新 -> 添加 Security.addProvider(new BouncyCastleProvider());修复了这个问题
以下错误是由于我的配置中添加了ActiveMQ Broker导致的。如果我删除 JMS 配置,此错误就会消失。
java.security.UnrecoverableKeyException: failed to decrypt safe contents entry:
javax.crypto.BadPaddingException: pad block corrupted
Spring 启动 2.1.1.RELEASE
使用 SSL 嵌入 Tomcat
ActiveMQ
@EnableJMS
更新:我从应用程序中删除了我的 JMSConfiguration.class,一切都开始工作了。 @EnableJMS 必须做一些覆盖某些事情的事情。我将系统地注释掉该配置 class 中的 bean,直到找到确切的罪魁祸首。我从未想过我的 JMS Active MQ 配置会与我的嵌入式 Tomcat 服务器的 SSL 配置发生冲突。
我已将其缩小到以下与 JMS 相关的 bean,这就是原因。如果我完全摆脱了 JMS 配置,那么我就不会收到密码错误。这些事情看似无关,但不知何故。
@Bean
public BrokerService broker() throws Exception {
final BrokerService broker = new BrokerService();
使用下面的配置,我在启动时遇到错误 Spring Boot.如果我删除所有 @Configuration classes 并启动 Spring Boot,此配置工作正常。我已经尝试过 PKCS、JKS 并且我已经尝试过文件:并且我已经移动了文件并且没有任何乐趣。我知道密码是正确的,因为它会正常启动,如果我删除我的配置 classes 并且我可以使用 443/ssl...
正常访问服务器
server.contextPath=/my
server.tomcat.additional-tld-skip-patterns=*.jar
server.compression.enabled=true
server.port=443
server.ssl.key-store:classpath:local-keystore.jks
server.ssl.key-store-password:password
server.ssl.keyStoreType:JKS
server.ssl.keyAlias:tomcat
遇到错误
org.apache.catalina.LifecycleException: Protocol handler start failed
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1001)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.StandardService.addConnector(StandardService.java:225)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:259)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:197)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.java:311)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:164)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
at com.jjkane.Application.main(Application.java:65)
Caused by: java.lang.IllegalArgumentException: keystore password was incorrect
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:114)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:85)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:224)
at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1067)
at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1149)
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:561)
at org.apache.catalina.connector.Connector.startInternal(Connector.java:998)
... 14 common frames omitted
Caused by: java.io.IOException: keystore password was incorrect
at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2108)
at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:243)
at java.base/java.security.KeyStore.load(KeyStore.java:1479)
at org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:179)
at org.apache.tomcat.util.net.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:204)
at org.apache.tomcat.util.net.jsse.JSSEUtil.getKeyManagers(JSSEUtil.java:203)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:112)
... 20 common frames omitted
java.security.UnrecoverableKeyException: failed to decrypt safe contents entry:
javax.crypto.BadPaddingException: pad block corrupted
更新:修改后同样的错误...
server.contextPath=/my
server.tomcat.additional-tld-skip-patterns=*.jar
server.compression.enabled=true
server.port=443
server.ssl.key-store=classpath:local-keystore.p12
server.ssl.key-store-password=tomcat
server.ssl.key-password=tomcat
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=tomcat
尝试使用 =
运算符而不是 :
。
server.ssl.key-store=classpath:local-keystore.jks
server.ssl.key-store-password=password
server.ssl.keyStoreType=JKS
server.ssl.keyAlias=tomcat
参考this
server.ssl.key-store:classpath:local-keystore.jks
尝试添加密钥库的绝对路径。
server.ssl.key-store=你的文件路径
您可能正在使用 JDK 8u161 之前的 java 版本,在这种情况下,可以通过将 Java 密码术扩展 (JCE) 无限强度管辖政策文件添加到Java 的安装。当 encryption/decryption 使用更长的密钥大小完成时,通常会出现问题。充气城堡也是解决这个问题的方法。
有关 JCE 文件的更多详细信息,请参阅 oracle 站点 https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
另一种解决方案是将您的 java 升级到上述版本或更高版本。
对于来自 Google 的其他人:虽然这个问题引导我们找到了解决方案,但接受的答案可能不是您应该寻找的答案。
我们有一个非常相似的案例。查看 BrokerService
的初始化代码,我们看到它以相当高的优先级添加了 Bouncycastle 作为安全提供程序:
try {
ClassLoader loader = BrokerService.class.getClassLoader();
Class<?> clazz = loader.loadClass("org.bouncycastle.jce.provider.BouncyCastleProvider");
Provider bouncycastle = (Provider) clazz.newInstance();
Security.insertProviderAt(bouncycastle, 2);
LOG.info("Loaded the Bouncy Castle security provider.");
} catch(Throwable e) {
// No BouncyCastle found so we use the default Java Security Provider
}
事实证明,默认的 JDK SunJCE 提供程序能够从我们的 *.p12 密钥库加载密钥,而 Bouncycastle 在尝试这样做时会抛出上述 "pad block corrupted" 错误。我们的解决方案是将 Bouncycastle 移动到 SunJCE 提供者 之后,如下所示:
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
Security.addProvider(new BouncyCastleProvider());
我的猜测是
解决了 OP 问题的原因
Adding Security.addProvider(new BouncyCastleProvider());
... 这样做 before 加载 ActiveMQ 会使 Bouncycastle 位于提供程序列表的末尾。重要的是它在SunJCE之后仍然存在。
我遇到了同样的问题。我将SpringBoot从2.2.4升级到2.3.2,解决了keystore密码错误,tomcat能够启动成功
更新 -> 添加 Security.addProvider(new BouncyCastleProvider());修复了这个问题
以下错误是由于我的配置中添加了ActiveMQ Broker导致的。如果我删除 JMS 配置,此错误就会消失。
java.security.UnrecoverableKeyException: failed to decrypt safe contents entry:
javax.crypto.BadPaddingException: pad block corrupted
Spring 启动 2.1.1.RELEASE 使用 SSL 嵌入 Tomcat ActiveMQ @EnableJMS
更新:我从应用程序中删除了我的 JMSConfiguration.class,一切都开始工作了。 @EnableJMS 必须做一些覆盖某些事情的事情。我将系统地注释掉该配置 class 中的 bean,直到找到确切的罪魁祸首。我从未想过我的 JMS Active MQ 配置会与我的嵌入式 Tomcat 服务器的 SSL 配置发生冲突。
我已将其缩小到以下与 JMS 相关的 bean,这就是原因。如果我完全摆脱了 JMS 配置,那么我就不会收到密码错误。这些事情看似无关,但不知何故。
@Bean
public BrokerService broker() throws Exception {
final BrokerService broker = new BrokerService();
使用下面的配置,我在启动时遇到错误 Spring Boot.如果我删除所有 @Configuration classes 并启动 Spring Boot,此配置工作正常。我已经尝试过 PKCS、JKS 并且我已经尝试过文件:并且我已经移动了文件并且没有任何乐趣。我知道密码是正确的,因为它会正常启动,如果我删除我的配置 classes 并且我可以使用 443/ssl...
正常访问服务器server.contextPath=/my
server.tomcat.additional-tld-skip-patterns=*.jar
server.compression.enabled=true
server.port=443
server.ssl.key-store:classpath:local-keystore.jks
server.ssl.key-store-password:password
server.ssl.keyStoreType:JKS
server.ssl.keyAlias:tomcat
遇到错误
org.apache.catalina.LifecycleException: Protocol handler start failed
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1001)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.StandardService.addConnector(StandardService.java:225)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:259)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:197)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.java:311)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:164)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
at com.jjkane.Application.main(Application.java:65)
Caused by: java.lang.IllegalArgumentException: keystore password was incorrect
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:114)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:85)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:224)
at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1067)
at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1149)
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:561)
at org.apache.catalina.connector.Connector.startInternal(Connector.java:998)
... 14 common frames omitted
Caused by: java.io.IOException: keystore password was incorrect
at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2108)
at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:243)
at java.base/java.security.KeyStore.load(KeyStore.java:1479)
at org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:179)
at org.apache.tomcat.util.net.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:204)
at org.apache.tomcat.util.net.jsse.JSSEUtil.getKeyManagers(JSSEUtil.java:203)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:112)
... 20 common frames omitted
java.security.UnrecoverableKeyException: failed to decrypt safe contents entry:
javax.crypto.BadPaddingException: pad block corrupted
更新:修改后同样的错误...
server.contextPath=/my
server.tomcat.additional-tld-skip-patterns=*.jar
server.compression.enabled=true
server.port=443
server.ssl.key-store=classpath:local-keystore.p12
server.ssl.key-store-password=tomcat
server.ssl.key-password=tomcat
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=tomcat
尝试使用 =
运算符而不是 :
。
server.ssl.key-store=classpath:local-keystore.jks
server.ssl.key-store-password=password
server.ssl.keyStoreType=JKS
server.ssl.keyAlias=tomcat
参考this
server.ssl.key-store:classpath:local-keystore.jks
尝试添加密钥库的绝对路径。
server.ssl.key-store=你的文件路径
您可能正在使用 JDK 8u161 之前的 java 版本,在这种情况下,可以通过将 Java 密码术扩展 (JCE) 无限强度管辖政策文件添加到Java 的安装。当 encryption/decryption 使用更长的密钥大小完成时,通常会出现问题。充气城堡也是解决这个问题的方法。 有关 JCE 文件的更多详细信息,请参阅 oracle 站点 https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
另一种解决方案是将您的 java 升级到上述版本或更高版本。
对于来自 Google 的其他人:虽然这个问题引导我们找到了解决方案,但接受的答案可能不是您应该寻找的答案。
我们有一个非常相似的案例。查看 BrokerService
的初始化代码,我们看到它以相当高的优先级添加了 Bouncycastle 作为安全提供程序:
try {
ClassLoader loader = BrokerService.class.getClassLoader();
Class<?> clazz = loader.loadClass("org.bouncycastle.jce.provider.BouncyCastleProvider");
Provider bouncycastle = (Provider) clazz.newInstance();
Security.insertProviderAt(bouncycastle, 2);
LOG.info("Loaded the Bouncy Castle security provider.");
} catch(Throwable e) {
// No BouncyCastle found so we use the default Java Security Provider
}
事实证明,默认的 JDK SunJCE 提供程序能够从我们的 *.p12 密钥库加载密钥,而 Bouncycastle 在尝试这样做时会抛出上述 "pad block corrupted" 错误。我们的解决方案是将 Bouncycastle 移动到 SunJCE 提供者 之后,如下所示:
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
Security.addProvider(new BouncyCastleProvider());
我的猜测是
解决了 OP 问题的原因Adding Security.addProvider(new BouncyCastleProvider());
... 这样做 before 加载 ActiveMQ 会使 Bouncycastle 位于提供程序列表的末尾。重要的是它在SunJCE之后仍然存在。
我遇到了同样的问题。我将SpringBoot从2.2.4升级到2.3.2,解决了keystore密码错误,tomcat能够启动成功