为什么此 SSL 连接突然终止

Why this SSL connection ends abruptly

我正在尝试发出 HTTPS POST 请求。连接在一开始就突然结束。我使用 Wireshark 进行了以下捕获。 192.168.0.33 是我的客户端尝试连接到服务器。 192.185.47.210 是服务器。

No.     Time           Source                Destination           Protocol Length Info
     51 2.476681000    192.168.0.33          192.185.47.210        TCP      62     1143→443 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 SACK_PERM=1
     52 2.534541000    192.185.47.210        192.168.0.33          TCP      62     443→1143 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460 SACK_PERM=1
     53 2.534559000    192.168.0.33          192.185.47.210        TCP      54     1143→443 [ACK] Seq=1 Ack=1 Win=65535 Len=0
     54 2.534720000    192.168.0.33          192.185.47.210        TLSv1    163    Client Hello
     56 2.592332000    192.185.47.210        192.168.0.33          TCP      60     443→1143 [ACK] Seq=1 Ack=110 Win=29200 Len=0
     57 2.594550000    192.185.47.210        192.168.0.33          TLSv1    191    Server Hello, Change Cipher Spec, Encrypted Handshake Message
     58 2.596455000    192.168.0.33          192.185.47.210        TCP      54     1143→443 [FIN, ACK] Seq=110 Ack=138 Win=65398 Len=0
     60 2.654542000    192.185.47.210        192.168.0.33          TCP      60     443→1143 [FIN, ACK] Seq=138 Ack=111 Win=29200 Len=0
     61 2.654558000    192.168.0.33          192.185.47.210        TCP      54     1143→443 [ACK] Seq=111 Ack=139 Win=65398 Len=0

我怀疑问题出在数据包 57 上,因为在收到此数据包后,客户端会断开 TCP 连接。数据包 57 看起来像

Frame 57: 191 bytes on wire (1528 bits), 191 bytes captured (1528 bits) on interface 0
Ethernet II, Src: Actionte_39:b9:de (18:1b:eb:39:b9:de), Dst: CadmusCo_f6:2b:9b (08:00:27:f6:2b:9b)
Internet Protocol Version 4, Src: 192.185.47.210 (192.185.47.210), Dst: 192.168.0.33 (192.168.0.33)
Transmission Control Protocol, Src Port: 443 (443), Dst Port: 1143 (1143), Seq: 1, Ack: 110, Len: 137
Secure Sockets Layer
    TLSv1 Record Layer: Handshake Protocol: Server Hello
        Content Type: Handshake (22)
        Version: TLS 1.0 (0x0301)
        Length: 81
        Handshake Protocol: Server Hello
    TLSv1 Record Layer: Change Cipher Spec Protocol: Change Cipher Spec
        Content Type: Change Cipher Spec (20)
        Version: TLS 1.0 (0x0301)
        Length: 1
        Change Cipher Spec Message
    TLSv1 Record Layer: Handshake Protocol: Encrypted Handshake Message
        Content Type: Handshake (22)
        Version: TLS 1.0 (0x0301)
        Length: 40
        Handshake Protocol: Encrypted Handshake Message

其他信息:

客户端是 Windows XP 上的 C# 程序 运行。该调用由 WebRequest (https://msdn.microsoft.com/en-us/library/system.net.webrequest%28v=vs.110%29.aspx) class 发出。服务器位于共享主机 (Hostgator) 上,具有专用 IP 和来自 COMODO 的 SSL 证书。

问题

谁能帮我理解为什么收到数据包 57 导致客户端断开连接?

可能服务器要求客户端发送客户端证书,而您没有。关闭连接是服务器唯一的防御措施。

基于我在评论中链接到的 this Q&A,以及额外的编辑 - 事实上,该连接尝试是由 Windows XP 中的 C# 进行的,最可能的原因是针对 Trusted 的验证根可能会失败。

您看到的问题可能不会出现在浏览器中;这可能令人惊讶。之所以如此,是因为网络浏览器通常会提供自己的一组信任数据,除了系统中的内容之外——而且可能是最新的,而 Windows 必须依赖 updates/service 包,这些包不不再出现(即使 OS 关于这些事情的政策可能比浏览器更严格一点)。

解决方案是将根添加到系统信任的根,或者以编程方式将其加载到您的应用程序中。