Java &引用;SSLHandshakeException:签署证书验证时出错;证书更新后
我有一个SpringBoot 2应用程序,在Tomcat8.5和Java8运行时中运行。 它正在为两个不同的证书/密钥使用JKS密钥库,这两个证书/密钥都由应用程序用于相互TLS(MTL) 由于我们从CA管理员处检索到了证书的新版本,应用程序无法再使用密钥库,出现以下例外情况:一旦尝试客户端mTLS调用,应用程序就无法再使用密钥库Java &引用;SSLHandshakeException:签署证书验证时出错;证书更新后,java,ssl,mtls,Java,Ssl,Mtls,我有一个SpringBoot 2应用程序,在Tomcat8.5和Java8运行时中运行。 它正在为两个不同的证书/密钥使用JKS密钥库,这两个证书/密钥都由应用程序用于相互TLS(MTL) 由于我们从CA管理员处检索到了证书的新版本,应用程序无法再使用密钥库,出现以下例外情况:一旦尝试客户端mTLS调用,应用程序就无法再使用密钥库 Exception in thread "main" javax.net.ssl.SSLHandshakeException: Error signing certi
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
线程“main”javax.net.ssl.SSLHandshakeException中的异常:对证书验证进行签名时出错
位于sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
位于sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1946)
位于sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316)
位于sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:1174)
位于sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:369)
位于sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037)
位于sun.security.ssl.Handshaker.process_记录(Handshaker.java:965)
位于sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1064)
位于sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)
位于sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395)
位于sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379)
位于sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
位于sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
位于sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:167)
在UrlEngine.submit(UrlEngine.java:52)上
在JCurl.execute(JCurl.java:126)
位于JCurl.main(JCurl.java:62)
原因:java.security.InvalidKeyException:没有安装的提供程序支持此密钥:sun.security.pkcs.PKCS8Key
位于java.security.Signature$Delegate.chooseProvider(Signature.java:1138)
位于java.security.Signature$Delegate.engineInitSign(Signature.java:1188)
位于java.security.Signature.initSign(Signature.java:553)
位于sun.security.ssl.HandshakeMessage$CertificateVerify(HandshakeMessage.java:1591)
位于sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:1171)
... 还有13个
我们已多次从PKCS12源代码重建密钥库,当使用导出的证书和密钥(例如curl)时,一切正常。我们终于找到了问题的解决方案。这是由JKS密钥库中设置的别名引起的。这些操作使用脚本从PKCS12生成JKS密钥库,同时将友好名称/别名设置为JKS密钥库。脚本自动生成并在JKS文件中设置的别名太长或包含无效字符。因此,我们通过将别名设置为只包含连字符和字母数字字符的非常短的名称来修复它 因此,如果使用以下命令遇到相同的问题,则可以修复该问题:
keytool -changealias -alias "previous-long-alias" -destalias "new-short-alias" -keystore /path/to/keystore.jks
如果需要,请使用
-keypass
和-storepass
参数。这里还有一件可能有用的事情,那就是这篇文章: