У меня есть приложение 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 все работает нормально.