Java SSLHandshakeException:空证书链

Java SSLHandshakeException:空证书链,java,ssl,Java,Ssl,我正在尝试在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 %% Inval

我正在尝试在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
有人能告诉我为什么会这样吗?可能是客户端拒绝证书吗


注:密钥和证书由另一方提供;我不能只生成我自己的。

问题在于而不是服务器的证书链。服务器拒绝连接,因为它希望客户端进行自身身份验证。我想我们可以这样说,因为堆栈跟踪包括
ServerHandshaker.clientCertificate()


Java的SSL引擎只有在调用时才需要客户端身份验证。

问题在于而不是服务器的证书链。服务器拒绝连接,因为它希望客户端进行自身身份验证。我想我们可以这样说,因为堆栈跟踪包括
ServerHandshaker.clientCertificate()


Java的SSL引擎只有在您调用时才需要客户端身份验证。

当服务器的信任库不包含CA时,我遇到了上述异常。服务器的CertificateRequest中没有包含CA,因此客户端别无选择,只能返回空列表。我已将fullchain.pem从LetsEncrypt certbot导入truststore,但这似乎不包括letsencryptauthorityx3.pem。
通过从下载letsencryptauthorityx3.pem解决
keytool-import-v-trustcacerts-alias letsencryptoauthorityx3-file letsencryptoauthorityx3.pem-keystore truststore.ks

当服务器的信任库不包含CA时,我遇到了上述异常。服务器的证书请求中不包含CA,因此客户端别无选择,只能返回空列表。我已将fullchain.pem从LetsEncrypt certbot导入truststore,但这似乎不包括letsencryptauthorityx3.pem。
通过从下载letsencryptauthorityx3.pem解决
keytool-import-v-trustcacerts-alias letsencryptoauthorityx3-file letsencryptoauthorityx3.pem-keystore truststore.ks

您省略和编辑的内容太多,无法确定,但您(找到并)发布的证书链可能是针对服务器的,同时发生了此异常(根据stacktrace确定)因为服务器请求客户端身份验证(也称为相互身份验证(entication)或双向身份验证(entication)或客户端证书(ificate)),并且客户端发送了空/空链,即未发送证书。不,客户没有拒绝证书或其他任何东西。@dave_thompson_085,你是对的。发布一个答案,这样我就可以给你评分了。你忽略和修改了太多内容,无法确定,但你(找到并)发布的证书链可能是针对服务器的,而发生此异常(根据stacktrace)是因为服务器请求了客户端身份验证(也称为相互身份验证(entication))或双向身份验证(entication)或客户端证书(iFate)),并且客户端发送了空/空链,即未发送证书。不,客户没有拒绝证书或其他任何东西。@dave_thompson_085,你是对的。发布一个答案,这样我就可以给你评分了。
dave_thompson_085
应该会因为发现了这个问题而获得评分,但我不能给他答案,因为他将答案作为评论发布。我发布了答案,所以我可以将这个问题标记为已回答。顺便问一下,您可以告诉我您在客户端做了哪些更改以避免上述异常吗?我在第三方服务器上也面临着类似的问题,我无法控制服务器端
dave_thompson_085
应该因为发现了这一点而获得荣誉,但我不能给他答案,因为他将答案作为评论发布。我发布了答案,所以我可以将这个问题标记为已回答。顺便问一下,您可以告诉我您在客户端做了哪些更改以避免上述异常吗?我面临着与第三方服务器类似的问题,我无法控制服务器端
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
  ...
]