Spring Boot 2.1 встроенный Tomcat - неверный пароль хранилища ключей

ОБНОВЛЕНИЕ -> Добавление Security.addProvider(new BouncyCastleProvider()); решает эту проблему

Следующая ошибка вызвана добавлением ActiveMQ Broker в мою конфигурацию. Если я удалю конфигурацию JMS, эта ошибка исчезнет.

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

Spring Boot 2.1.1.RELEASE Встроенный Tomcat с SSL ActiveMQ @EnableJMS

ОБНОВЛЕНИЕ: я удалил свой JMSConfiguration.class из приложения, и все заработало. @EnableJMS должен делать что-то, что отменяет что-то. Я собираюсь систематически комментировать bean-компоненты в этом классе конфигурации, пока не найду точного виновника. Я бы никогда не подумал, что моя конфигурация JMS Active MQ будет конфликтовать с конфигурацией SSL моего встроенного сервера Tomcat.

Я сузил его до следующего компонента, связанного с JMS, который является причиной. Если полностью избавиться от конфига JMS, то ошибка с паролем не появляется. Казалось бы, эти вещи не связаны, но они как-то связаны.

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

Используя приведенную ниже конфигурацию, я получаю сообщение об ошибке при запуске Spring Boot. Если я удалю все свои классы @Configuration и просто запущу Spring Boot, эта конфигурация будет работать нормально. Я пробовал PKCS, JKS и файл: я перемещал файл и не получал удовольствия. Я знаю, что пароль правильный, потому что он запустится нормально, если я удалю свои классы конфигурации и смогу нормально попасть на сервер, используя 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

person chrislhardin    schedule 23.12.2018    source источник
comment
да, keytool расшифровывает пароль tomcat   -  person chrislhardin    schedule 23.12.2018


Ответы (5)


Возможно, вы используете версию Java, предшествующую JDK 8u161, в этом случае это исключение можно устранить, добавив файлы политики юрисдикции с неограниченной силой Java Cryptography Extension (JCE) в установку Java. Проблема обычно возникает, когда шифрование/дешифрование выполняется с использованием более длинного ключа. Надувной замок также является решением этой проблемы. Дополнительные сведения о файле JCE см. на сайте оракула https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

Другое решение — обновить Java до указанной или более поздней версии.

person Sudhir    schedule 02.01.2019

Для других из 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 выдает вышеупомянутую ошибку «поврежденный блок площадки» при попытке сделать это. Решение для нас состояло в том, чтобы переместить Bouncycastle после провайдера SunJCE следующим образом:

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

Я предполагаю, что причина, по которой проблема ОП была решена

Добавление Security.addProvider(новый BouncyCastleProvider());

... заключается в том, что при этом до загрузки ActiveMQ Bouncycastle остается в конце списка поставщиков. Важно то, что он остается после SunJCE.

person netmikey    schedule 04.04.2019

попробуйте с оператором = вместо :.

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

См. это

person Alien    schedule 23.12.2018

server.ssl.key-store:classpath:local-keystore.jks

Попробуйте добавить абсолютный путь к хранилищу ключей.

server.ssl.key-store=путь к вашему файлу

person A.J.    schedule 23.12.2018
comment
Тот же результат... не удалось расшифровать запись безопасного содержимого: javax.crypto.BadPaddingException: поврежден блок пэда - person chrislhardin; 24.12.2018

Я была такая же проблема. Я обновил SpringBoot с 2.2.4 до 2.3.2, и ошибка пароля хранилища ключей была устранена, и tomcat смог успешно запуститься.

person Carlos    schedule 04.08.2020