SSL 握手失败

信息安全 tls openssl 会话管理
2021-08-13 12:12:01

我正在开发使用 C++(IDE:Qt 创建者)创建的 Windows 桌面应用程序。它有登录面板,我在其中使用 openssl 1.0 库通过 https 连接进行用户验证。应用程序在大多数机器上工作,但我在从几台机器建立 https 连接时也遇到“SSL 握手失败”错误。

我尝试使用wireshark调试错误。我的观察如下:

1) 客户端向服务器发送 [SYN]。
2) 服务器向客户端发送 [SYN,ACK]。
3) 客户端向服务器发送 [ACK]。
4) 客户端向服务器发送消息“Client Hello”。
5) 服务器发送它的公钥和消息“Server Hello, Certificate, Server Hello Done”
6) 客户端发送它的公钥和消息“Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message”
7) 服务器发送加密的握手消息带有消息“Change Cipher Spec, Encrypted Handshake Message”
8) 客户端发送 [FIN,ACK]
9) 服务器发送 [FIN,ACK]
10) 客户端发送 [FIN]

第七步,客户端一收到服务器发来的加密消息,客户端就通过FIN信号发起终止握手。任何想法,为什么客户端在双方交换密钥后会以“SSL 握手失败”的形式断开 ssl 连接?

2个回答

您对握手的描述似乎表明客户端和服务器完全进行了握手,然后客户端断开了连接。这意味着从客户的角度来看,“某事”是不正确的。主要有两种可能的候选人:

  1. 服务器发送的证书不“正确”;客户认为有必要进行一些用户验证。客户端完成了握手,以便它可以使用更快的“简短握手”重新打开 SSL 会话(重用协商的“主密钥”而不必再次使用非对称加密),但关闭连接以免资源保持打开状态服务器,而人类用户下定决心(肉袋很)。

  2. Finished由于某些错误(可能在客户端中),服务器发送消息(即“加密握手消息”)包含不正确的值(从客户端的角度来看)。这不太可能发生。

我的猜测是您属于第一种情况:服务器使用对客户端“不好”的证​​书链。通常的罪魁祸首:

  • 服务器证书链不链接到客户端的“受信任的根”之一(取决于客户端上使用的库,根列表可能位于多个位置)。
  • 正如客户端所期望的那样,服务器名称(其 URL 中的名称)与服务器证书中的名称不匹配。
  • 客户端时钟非常关闭,因此它拒绝某些证书,从它的角度来看,这些证书要么是“将来”颁发的,要么是长期过期的。

将服务器的证书导出到客户端计算机到一个文件,例如 servercert.crt。在客户端运行: certutil -verify -urlfetch servercert.crt

它几乎肯定会告诉您为什么服务器证书链被认为无效。问候