0

我有一个 SpringBoot 2 应用程序,在带有 Java8 Runtime 的 Tomcat 8.5 中运行。它正在为两个不同的证书/密钥使用 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

我们已经从它的 PKCS12 源多次重建了密钥库,当使用导出的证书和密钥时,例如 curl,一切正常。

4

1 回答 1

0

我们终于找到了问题的解决方案。这是由 JKS 密钥库中设置的别名引起的。这些操作使用脚本从 PKCS12 生成 JKS 密钥库,同时将友好名称/别名设置为 JKS 密钥库。由脚本自动生成并在 JKS 文件中设置的别名太长或包含无效字符。因此,我们通过将别名设置为仅包含连字符和字母数字字符的非常短的名称来修复它。

因此,如果您使用以下命令遇到相同的问题,则可以解决此问题:

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

如果需要,使用-keypassand-storepass参数。

于 2020-02-20T15:25:21.123 回答