为什么 SSL 连接会突然断开?

3

我想发起一个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/zh-cn/library/system.net.webrequest%28v=vs.110%29.aspx)进行的。服务器位于共享托管(Hostgator),具有专用IP和来自COMODO的SSL证书。

问题

有人能帮我理解为什么接收数据包57会导致客户端断开连接吗?


你能提供一下你正在使用的软件的更多细节吗? - TNW
@TNW。在问题结尾处添加“其他信息”。 - George
查了一下,看看这些。 可能是连接尝试验证 XP 的受信任根证书,这可能有点古老。 - TNW
您的意思是服务器发送了其证书,但客户端拒绝了吗?我不理解我发布的TLSv1跟踪信息,因此无法确定是否发送了证书。您能指出您在哪里看到它吗? - George
我习惯于Wireshark快速识别问题。由于这似乎没有帮助,你可以尝试提高.NET日志记录吗?您可以按照以下步骤输出一些SSL调试信息:https://msdn.microsoft.com/en-us/library/ty48b824(v=vs.110).aspx - jglouie
显示剩余2条评论
2个回答

2
基于我在评论中链接的这个问答和编辑过的事实,连接尝试是由Windows XP中的C#发起的,最有可能的原因是验证受信任根证书失败。
您在浏览器中可能看不到此问题,这可能令人惊讶。这是因为Web浏览器通常提供自己的信任数据集,除了系统中的内容之外,而且可能更加更新,而Windows必须依赖于更新/服务包,这些更新/服务包已经不再出现(即使操作系统对这些事情的政策可能比浏览器更严格)。
解决方案将是将根添加到系统信任列表中,或在应用程序中以编程方式加载它。

-1

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


根据数据包捕获,客户端将FIN(数据包#58)作为响应发送到服务器的hello、certificate等(数据包#57)。这意味着客户端而不是服务器发起关闭。此外,服务器没有发送CertificateRequest,那么客户端为什么要发送客户端证书呢? - Steffen Ullrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接