«SSLHandshakeException: Ошибка подписи сертификата проверяется» после обновления сертификата - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть приложение SpringBoot 2, работающее в Tomcat 8.5 с Java8 Runtime. Он использует JKS Keystore для двух разных сертификатов / ключей, которые оба используются приложением для взаимного 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

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

1 Ответ

0 голосов
/ 20 февраля 2020

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

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

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

При необходимости используйте аргументы -keypass и -storepass.

...