Spring Boot 2.1 嵌入 Tomcat - 密钥库密码不正确

chr*_*din 5 java spring-boot embedded-tomcat-8

更新 -> 添加 Security.addProvider(new BouncyCastleProvider()); 修复了这个问题

以下错误是由于在我的配置中添加 ActiveMQ Broker 引起的。如果删除 JMS 配置,此错误就会消失。

 java.security.UnrecoverableKeyException: failed to decrypt safe contents entry:
    javax.crypto.BadPaddingException: pad block corrupted  
Run Code Online (Sandbox Code Playgroud)

Spring Boot 2.1.1.RELEASE 嵌入式 Tomcat 与 SSL ActiveMQ @EnableJMS

更新:我从应用程序中删除了 JMSConfiguration.class,一切都开始工作。@EnableJMS 必须做一些覆盖某些事情的事情。我将系统地注释掉该配置类中的 bean,直到找到确切的罪魁祸首。我从未想过我的 JMS Active MQ 配置会与嵌入式 Tomcat 服务器的 SSL 配置发生冲突。

我已将其范围缩小到以下与 JMS 相关的 bean,这就是原因。如果我完全删除 JMS 配置,那么我就不会收到密码错误。这些事情看似无关,但不知何故却有联系。

@Bean
public BrokerService broker() throws Exception {
    final BrokerService broker = new BrokerService();
Run Code Online (Sandbox Code Playgroud)

使用下面的配置,启动 Spring Boot 时出现错误。如果我删除所有 @Configuration 类并启动 Spring Boot,则此配置工作正常。我尝试过 PKCS、JKS,也尝试过 file:,我已经移动了文件,但没有任何乐趣。我知道密码是正确的,因为如果我删除我的配置类,它会正常启动,并且我可以使用 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
Run Code Online (Sandbox Code Playgroud)

遇到错误

    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  
Run Code Online (Sandbox Code Playgroud)

更新:修改后出现同样的错误...

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
Run Code Online (Sandbox Code Playgroud)

Sud*_*hir 4

您可能使用的是 JDK 8u161 之前的 java 版本,在这种情况下,可以通过在 Java 安装中添加 Java 加密扩展 (JCE) 无限强度管辖策略文件来解决此异常。当使用较长的密钥大小完成加密/解密时,通常会出现问题。充气城堡也是这个问题的解决方案。有关 JCE 文件的更多详细信息,请参阅 Oracle 网站 https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

另一个解决方案是将您的 java 升级到上述或更高版本。