我试图在Java客户机-服务器应用程序中建立SSL连接。我提供了一个包含完整证书链的JKS密钥存储库,但我仍然在服务器中获得以下异常:
upcoming handshake states: server finished[20]
*** Certificate chain
<Empty>
***
fatal error: 42: null cert chain
javax.net.ssl.SSLHandshakeException: null cert chain
%% Invalidated: [Session-5, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384]
MyThread
, SEND TLSv1.2 ALERT:
fatal,
description = bad_certificate
MyThread, WRITE: TLSv1.2 Alert, length = 2
MyThread, fatal: engine already closed. Rethrowing javax.net.ssl.SSLHandshakeException: null cert chain
Stack Trace
javax.net.ssl.SSLHandshakeException: null cert chain
at sun.security.ssl.Handshaker.checkThrown(Handshaker.java:1521) ~[?:1.8.0_211]
at sun.security.ssl.SSLEngineImpl.checkTaskThrown(SSLEngineImpl.java:528) ~[?:1.8.0_211]
at sun.security.ssl.SSLEngineImpl.writeAppRecord(SSLEngineImpl.java:1197) ~[?:1.8.0_211]
at sun.security.ssl.SSLEngineImpl.wrap(SSLEngineImpl.java:1165) ~[?:1.8.0_211]
at javax.net.ssl.SSLEngine.wrap(SSLEngine.java:469) ~[?:1.8.0_211]
... 4 more
Caused by: javax.net.ssl.SSLHandshakeException: null cert chain
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) ~[?:1.8.0_211]
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1647) ~[?:1.8.0_211]
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:318) ~[?:1.8.0_211]
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:306) ~[?:1.8.0_211]
at sun.security.ssl.ServerHandshaker.clientCertificate(ServerHandshaker.java:1939) ~[?:1.8.0_211]
at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:232) ~[?:1.8.0_211]
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037) ~[?:1.8.0_211]
at sun.security.ssl.Handshaker$1.run(Handshaker.java:970) ~[?:1.8.0_211]
at sun.security.ssl.Handshaker$1.run(Handshaker.java:967) ~[?:1.8.0_211]
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_211]
at sun.security.ssl.Handshaker$DelegatedTask.run(Handshaker.java:1459) ~[?:1.8.0_211]
... 2 more这是,不是由于缺少证书造成的。在调试的前面,我们看到以下证书,它们对SSL的顺序是正确的(最具体的第一个是root ca last):
upcoming handshake states: server finished[20]
chain [0] = [
[
Version: V3
Subject: CN=ABC
...
Issuer: CN=DEF
...
]
chain [1] = [
[
Version: V3
Subject: CN=DEF
...
Issuer: CN=GHI
...
]
chain [2] = [
[
Version: V3
Subject: CN=GHI
...
Issuer: CN=GHI
...
]有人能告诉我为什么会发生这种事吗?可能是客户拒绝证书吗?
注意:密钥和证书是由另一方提供的,我不能只生成我自己的。
发布于 2019-07-21 19:29:38
问题是不是服务器的证书链。服务器拒绝连接,因为它期望客户端对自己进行身份验证。我认为我们可以分辨这一点,因为堆栈跟踪包括ServerHandshaker.clientCertificate()。
只有在调用SSLEngine.setNeedClientAuth()时,Java引擎才需要客户端身份验证。
发布于 2020-11-17 12:54:20
当服务器的信任库不包含CA时,我得到了上述异常。服务器没有在其CertificateRequest中包含CA,因此客户端别无选择,只能返回一个空列表。我已经将fullchain.pem从LetsEncrypt certbot导入到信任库中,但这似乎不包括letsencryptauthorityx3.pem。
通过从https://letsencrypt.org/certificates/ keytool -import -v -trustcacerts -alias letsencryptauthorityx3 -file中下载letsencryptauthorityx3.pem解决问题
https://stackoverflow.com/questions/57084340
复制相似问题