首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSL相互身份验证失败

SSL相互身份验证失败
EN

Security用户
提问于 2014-06-21 17:03:27
回答 1查看 11.9K关注 0票数 4

当我试图在服务器和客户端之间建立一个相互认证时,我会得到下面的错误。

服务器和客户端之间的时间完全相同,服务器和客户端的证书也是合适的。造成此错误的原因是什么?发生此错误的可能方法是什么?

代码语言:javascript
复制
  Thread-10, WRITE: TLSv1 Change Cipher Spec, length = 1
[Raw write]: length = 6
0000: 14 03 01 00 01 01                                  ......
*** Finished
verify_data:  { 130, 243, 38, 76, 253, 223, 88, 181, 223, 28, 110, 123 }
***
[write] MD5 and SHA1 hashes:  len = 16
0000: 14 00 00 0C 82 F3 26 4C   FD DF 58 B5 DF 1C 6E 7B  ......&L..X...n.
Padded plaintext before ENCRYPTION:  len = 48
0000: 14 00 00 0C 82 F3 26 4C   FD DF 58 B5 DF 1C 6E 7B  ......&L..X...n.
0010: F5 44 95 0D 5A D0 8E 6F   40 89 10 2D 00 5F BB CF  .D..Z..o@..-._..
0020: 30 D1 C6 06 0B 0B 0B 0B   0B 0B 0B 0B 0B 0B 0B 0B  0...............
Thread-8, WRITE: TLSv1 Handshake, length = 48
Thread-8, waiting for close_notify or alert: state 1
[Raw read]: length = 5
0000: 15 03 01 00 02                                     .....
[Raw read]: length = 2
0000: 02 2E                                              ..
Thread-8, READ: TLSv1 Alert, length = 2
Thread-8, RECV TLSv1 ALERT:  fatal, certificate_unknown
%% Invalidated:  [Session-4, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA]
Thread-8, called closeSocket()
Thread-8, Exception while waiting for close javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
Thread-8, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
Thread-8, called close()
Thread-8, called closeInternal(true)

非常感谢你的帮助。

EN

回答 1

Security用户

发布于 2014-06-22 11:06:11

好吧,你说:

证书在服务器和客户端都是正确的。

但至少有一个系统不同意:

收到致命警报: certificate_unknown

此消息意味着一方(您没有说明您是显示客户端日志还是服务器端日志)收到了来自服务器的明确警告消息,即类“致命”和值46 (0x2E,又名"certificate_unknown")。正如TLS 1.0标准中所指定的:

certificate_unknown

代码语言:javascript
复制
    Some other (unspecified) issue arose in processing the
    certificate, rendering it unacceptable.

“其他”意味着它不是证书过期或撤销的问题,也不是使用不受支持的加密算法的问题。接收到的证书可能有许多“不可接受”的原因,其中最重要的原因是无法从先验已知的可信根CA构建有效链,直到证书本身(通常,在这种情况下,系统应该发送"unknown_ca“警报,但许多系统在向证书报告错误时没有这样的精确性)。

为了进一步调查这一问题,你应该:

  • 激活客户端和服务器上的完整日志记录。您显示来自接收警报消息的系统的日志;您应该查看来自发送警报消息的其他系统的日志;
  • 验证两个系统的配置,特别是发送警报消息的系统(即不是抛出“接收到的致命警报”异常的系统,而是另一个系统)它用于验证对等方证书的信任锚;
  • 检查系统实际发送的证书链。因为这是在激活加密之前发生的,所以某些网络监视工具la Wireshark应该可以看到证书。值得注意的是,检查顺序:在SSL/TLS中,终端实体证书首先出现,然后是颁发证书的CA,然后是颁发该CA的CA,依此类推。

还请记住,客户端证书只对身份验证有意义,而不是作为授权。即使客户端发送了一个证书,服务器可以对受信任的根进行验证,这也只会告诉位于行另一端的服务器。仍然要由服务器来决定是否允许该特定客户端继续工作。这通常需要将客户端证书映射到身份或角色,例如从证书中提取特定字段。这个过程完全超出了TLS本身的范围,但是仍然必须发生,所以在服务器端有一些您可能希望检查的软件和一些配置。

在另一个方向(由客户机验证服务器的证书),规则是在RFC 2818中指定的,至少在HTTPS的上下文中是这样的:预期的服务器名称(从目标URL中提取)应该出现在服务器的证书中。在HTTPS之外,由每个客户端应用程序来决定他们从服务器获得的证书是否正确,即证书是否有效(由受信任的CA等正确地颁发),而且标识的服务器确实是客户应该与之交谈的服务器。再来一次配置。

票数 5
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/61578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档