【发布时间】:2014-12-02 19:37:16
【问题描述】:
关于 POODLE,现在在服务器上禁用 SSLv3。
客户端软件是在 .NET 2.0 中开发的,并提供 TLSv1 作为唯一的替代方案。我有权更改客户端应用程序和服务器配置。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; 用于强制所有 HttpWebRequest.GetResponse() 调用使用 TLSv1。
并且SslStream.AuthenicateAsClient() 与参数SslProtocols.Tls 一起使用以强制在安全证书检索期间使用TLSv1。
最初的问题 (described here) 与收到关于Unrecognized name 的TLS Alert 有关。
Wireshark 在握手期间显示以下内容 (AuthenicateAsClient):
TLSv1 182 Client Hello
TLSv1 742 Alert (Level: Warning, Description: Unrecognized Name), Server Hello, Certificate, Server Hello Done
客户端在此调用中抛出以下异常:
AuthenticateAsClient: System.IO.IOException: Unable to read data from the transport connection
---> System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
To correct this issue,apache conf 文件已修改为包含正确的ServerName 值。
现在我不再收到Unrecognized name 警告,但我发现另一个问题:
Wireshark 在握手期间显示以下内容 (AuthenicateAsClient):
SSL 182 Client Hello
TCP 60 443→57062 [RST, ACK] Seq=1 Ack=129 Win=0 Len=0 <--- SHOWN IN RED
客户端在这次调用中抛出一个不同的异常:
System.IO.IOException: Unable to read data from the transport connection
---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
有趣的是,Wireshark 在Client Hello 的“协议”列中显示SSL——我怀疑这可能与forcibly closed 异常有关——但是,扩展了@987654339显示的框架下方的@ 部分,显示使用了 TLSv1 ...这很奇怪,但我无法理解...也许关于RST, ACK 响应的线索?
如果我从 apache conf 中删除了 ServerName 值,那么 Wireshark 会向客户端显示 Client Hello 的 TLSv1, 没有任何更改。也许我没有正确解释 Wireshark 向我显示的内容......
但是,我确实在该 ACK 消息中看到了 Reset bit/flag set - 我相信 .NET 会解释并向客户端发送异常 - 我不明白为什么会发生这种情况,因此发布了这个问题。
我还尝试在 apache conf 文件中设置 SSLStrictSNIVHostCheck off 而不是 ServerName 更改,希望完全更改为 disabling SNI:
Wireshark 和客户端应用程序显示与 Unrecognized name 问题有关的相同错误。
然后我尝试设置SSLStrictSNIVHostCheck off AND 正确设置ServerName:
Wireshark 和客户端应用程序显示了与 forcibly closed 错误相关的相同响应。
是否有一些 apache conf 设置可以允许这种通信而不会出错? ...或者如果有人可以指出我确定是什么导致 RESET 标志的方向...
或者在 C# 客户端代码中是否有某种方法可以避免发送带有握手的 SNI(客户端问候)? ...这就是 XP 起作用的原因;那时它不会发送 SNI 分机。
...到目前为止,我为此找到的唯一可行的替代方法是将客户端迁移到 .NET 4.0 --- 但是,这对于这个代码库目前是不可行的。
【问题讨论】: