"SSLHandshakeException: Ошибка подписи сертификата проверки" после обновления сертификата

У меня есть приложение SpringBoot 2, работающее в Tomcat 8.5 с Java8 Runtime. Он использует хранилище ключей JKS для двух разных сертификатов / ключей, которые оба используются приложением для взаимного TLS (mTLS).

Поскольку мы получили новую версию сертификата от администратора CA, приложение больше не может использовать хранилище ключей, за следующим исключением, как только будет предпринята попытка вызова mTLS клиента.

Exception in thread "main" javax.net.ssl.SSLHandshakeException: Error signing certificate verify
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1946)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316)
    at sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:1174)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:369)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:965)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1064)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:167)
    at UrlEngine.submit(UrlEngine.java:52)
    at JCurl.execute(JCurl.java:126)
    at JCurl.main(JCurl.java:62)
Caused by: java.security.InvalidKeyException: No installed provider supports this key: sun.security.pkcs.PKCS8Key
    at java.security.Signature$Delegate.chooseProvider(Signature.java:1138)
    at java.security.Signature$Delegate.engineInitSign(Signature.java:1188)
    at java.security.Signature.initSign(Signature.java:553)
    at sun.security.ssl.HandshakeMessage$CertificateVerify.<init>(HandshakeMessage.java:1591)
    at sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:1171)
    ... 13 more

Мы несколько раз перестраивали Keystore из его источника PKCS12, и при использовании экспортированного сертификата и ключа, например, с curl, все работает нормально.

1 ответ

Наконец-то мы нашли решение проблемы. Это было вызвано псевдонимом, установленным в хранилище ключей JKS. В операциях используется сценарий для создания хранилища ключей JKS из PKCS12, при этом понятные имена / псевдонимы устанавливаются для хранилища ключей JKS. Псевдоним, который был автоматически создан сценарием и установлен в файле JKS, слишком длинный или содержит недопустимые символы. Таким образом, мы исправили это, установив псевдоним на очень короткое имя, которое содержало только дефисы и буквенно-цифровые символы.

Таким образом, вы можете исправить проблему, если столкнетесь с той же проблемой, используя эту команду:

keytool -changealias -alias "previous-long-alias" -destalias "new-short-alias" -keystore /path/to/keystore.jks 

Использовать -keypass а также -storepass аргументы, если необходимо.

Другие вопросы по тегам