【问题标题】:How to tell if server or client auth failed in two way SSL handshake如何判断服务器或客户端身份验证是否以两种方式 SSL 握手失败
【发布时间】:2019-11-01 13:25:41
【问题描述】:

以下是来自客户端身份验证失败 SSL 握手的调试输出的 sn-p。我几乎可以肯定我的密钥库中有所有相关的证书。我还尝试信任像 -Dcom.sun.net.ssl.checkRevocation=false 这样的所有服务器,并基于 Medhi 对此 Is there a java setting for disabling certificate validation? 的回答。我总是得到相同的 unknown_ca 异常。

这个异常是否可能来自不喜欢我作为客户端提供的凭据的服务器?如何判断这个错误来自哪一侧?

0000: A6 B5 D1 75 74 B2 73 97   E1 B2 BA 5B 56 75 6E 09  ...ut.s....[Vun.
Server write key:
0000: E3 DF 3B CC 9A 6C DF A4   47 A0 69 51 D9 80 0F F2  ..;..l..G.iQ....
... no IV derived for this protocol
*** CertificateVerify
Signature Algorithm SHA512withRSA
MyMain, WRITE: TLSv1.2 Handshake, length = 264
MyMain, WRITE: TLSv1.2 Change Cipher Spec, length = 1
*** Finished
verify_data:  { 69, 68, 30, 177, 182, 137, 211, 81, 29, 49, 195, 244 }
***
MyMain, WRITE: TLSv1.2 Handshake, length = 80
MyMain, READ: TLSv1.2 Alert, length = 2
MyMain, RECV TLSv1.2 ALERT:  fatal, unknown_ca
%% Invalidated:  [Session-1, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256]
MyMain, called closeSocket()

【问题讨论】:

  • RECV ALERT 表示您收到警报,这意味着对等方生成了它。

标签: java ssl


【解决方案1】:
MyMain, RECV TLSv1.2 ALERT:  fatal, unknown_ca

客户端收到来自服务器的 TLS 警报,因为服务器不知道(未知),因此不信任客户端发送的证书的颁发者 (ca)。

这意味着您的客户端没有发送服务器期望的证书,或者客户端未能包含必要的中间证书,从而导致证书验证失败,或者可能是服务器端配置错误。

...我也尝试过信任所有服务器...

这在这里没有帮助。问题不是客户端无法验证服务器证书,而是服务器无法验证客户端证书。在客户端站点上禁用证书验证对服务器端的证书验证没有影响,这就是这里的问题。

【讨论】:

  • 这似乎也是客户端的协议错误,因为不允许发送最终未由 CertificateRequest 消息中提到的服务器签名者之一签名的证书。
  • @user207421:提供的调试信息中没有任何内容表明服务器正在发送已接受 CA 的列表。请注意,这样的列表是可选的(即可能为空)在这种情况下“......客户端可以发送适当的 ClientCertificateType 的任何证书,除非有一些相反的外部安排”(RFC 5246 第 7.4.4 节)。
  • 感谢您的确认。我也有同样的怀疑。该网络服务由合作伙伴运行,他坚持认为我没有安装他们的证书。让我发问。我提供给他们以识别我的证书是他们为我生成的证书。它没有中间证书。它确实链接到他们也提供的根证书。我是否可能需要使用他们提供给我的证书的公钥发送此根证书?看起来很疯狂,我怀疑他们这边出了点问题,但我是 SSL 的菜鸟。
  • @Evan:根证书不需要发送也不应该发送。
  • 欣赏它。对我来说很有意义。
猜你喜欢
  • 2014-11-13
  • 2016-09-23
  • 1970-01-01
  • 2014-04-14
  • 2019-07-21
  • 1970-01-01
  • 2019-01-08
  • 2017-10-09
  • 1970-01-01
相关资源
最近更新 更多