当前位置: 首页 > 知识库问答 >
问题:

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

顾俊楚
2023-03-14

更新-

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

 java.security.UnrecoverableKeyException: failed to decrypt safe contents entry:
    javax.crypto.BadPaddingException: pad block corrupted  

Spring靴2.1.1。使用SSL ActiveMQ@EnableJMS发布嵌入式Tomcat

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

我已经把它缩小到以下与JMS相关的bean,这就是原因。如果我完全摆脱了JMS配置,那么我就不会得到密码错误。看起来这些事情是不相关的,但不知何故它们是相关的。

@Bean
public BrokerService broker() throws Exception {
    final BrokerService broker = new BrokerService();

使用下面的配置,我在启动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

遇到的错误

    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

共有3个答案

钱均
2023-03-14

尝试使用=运算符而不是

server.ssl.key-store=classpath:local-keystore.jks    
server.ssl.key-store-password=password
server.ssl.keyStoreType=JKS
server.ssl.keyAlias=tomcat

参考这个

吴哲
2023-03-14

对于来自谷歌的其他人来说:虽然这个问题让我们找到了解决方案,但公认的答案可能不是你应该寻找的。

我们有一个非常相似的案例。查看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 keystore while Bouncycastle在尝试执行此操作时抛出上述“pad block corrupted”错误。我们的解决方案是在SunJCE提供商之后移动Bouncycastle,如下所示:

Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
Security.addProvider(new BouncyCastleProvider());

我猜OP的问题是因为

增加安全性。addProvider(新的BouncyCastleProvider());

...在加载ActiveMQ之前这样做会使BouncyCastle保持在提供程序列表的末尾。重要的是它在SunJCE之后仍然存在。

胥玮
2023-03-14

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

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

 类似资料:
  • 我用过这个命令 生成密钥库。它工作正常,但从我读到的内容来看,这个命令还应该提示您输入密钥密码(而不是存储密码)?我从来没有收到过这样的提示。我能跑 查看密钥库的内容。钥匙似乎就在那里。。。正确的别名在那里。在哪里获取/设置特定别名的密码? 我有一个key.properties在Android目录 在build.gradle我有: 当我试图生成一个发布版本时,我得到了 我想它可能与keyPassw

  • 问题内容: 我目前有一个密钥库,其中只有我应该知道的特定密码。现在,我需要将对该密钥库的访问权授予其他人,因此我想: 1)更改密码,以便我可以与他人共享该密码并让他们签名 2)创建一个不同的密码并允许他们使用它进行签名。 这可能吗?以及-如果是-怎么样? 问题答案: 密钥库只有一个密码。您可以使用keytool进行更改: 要更改密钥的密码:

  • 有人能帮我整合一下。带jmeter的pfx客户端证书?我已将pfx文件转换为jks文件。我已经在系统中添加了相同的功能。财产。但我无法执行客户的请求。我得到以下错误。 2018-11-08 22:31:08137信息o.a.j.u.SSLManager:JmeterKeyStore位置:C:MyWorkSpace/apache-jmeter-5.0certclientcert。jks type j

  • 我正试图更改存储在p12密钥库中的证书的密码。我设法通过使用ikeycmd更改了keystore密码,但对于键控器,似乎什么都不起作用。这是我正在尝试的命令: keytool-keypasswd-storetype pkcs12-keystore$keystore_file-alias$key_alias-keypass$key_password-new$new_pass-storepass$st

  • KeyToolException:无法从存储区“C:\Keystore\Keystore.jks”中读取密钥“app name”密钥:密钥存储区被篡改,或者密码不正确 我最好的解决办法是什么?