Windows 8 IE 10 TLS 握手错误到 Centos 6.6 上的 Apache 2.2

Windows 8 IE 10 TLS 握手错误到 Centos 6.6 上的 Apache 2.2

我们对此感到十分困惑。在升级到运行在 CentOS 6.6 上的较新的 Apache 环境时,我们遇到了来自 Windows 8 机器的 TLS 连接的奇怪问题。错误的第一个迹象是 IE10 的用户抱怨以及在 Windows 8 上运行的 .NET 应用程序调用我们的 Web 服务。

我们安装了运行 IE 10 和 Fiddler 4 的 Windows 8 modern.ie VM。我们注意到在 Fiddler 4 中隧道命令会定期显示输出:

HTTP/1.1 200 Connection Established
FiddlerGateway: Direct
StartTime: 14:59:42.679
Connection: close

fiddler.network.https> HTTPS handshake to hostname.com failed. System.Security.Authentication.AuthenticationException A call to SSPI failed, see inner exception. < The logon attempt failed

当我们查看机器上的 Windows 事件查看器时,我们会看到 Windows 事件 36887 和消息。

A fatal alert was received from the remote endpoint.  The TLS protocol defined fatal alert code is 49.

因此我们转到 Web 服务器。服务器正在运行:

httpd.x86_64        2.2.15-39.el6.centos
httpd-tools.x86_64  2.2.15-39.el6.centos
mod_ssl.x86_64      1:2.2.15-39.el6.centos
openssl.x86_64      1.0.1e-30.el6_6.7   @updates

我们设置了一个 DEBUG 日志来收集有关流量的信息。我们通常会在输出中看到以下内容:

[Tue Mar 24 17:38:08 2015] [debug] ssl_engine_io.c(1935): OpenSSL: I/O error, 5 bytes expected to read on BIO#31854001770 [mem: 3187c0110c3]
[Tue Mar 24 17:38:08 2015] [debug] ssl_engine_kernel.c(1882): OpenSSL: Exit: error in SSLv3 read finished A
[Tue Mar 24 17:38:08 2015] [debug] ssl_engine_kernel.c(1882): OpenSSL: Exit: error in SSLv3 read finished A
[Tue Mar 24 17:38:08 2015] [info] [client 123.125.71.101] (70007)The timeout specified has expired: SSL handshake interrupted by system [Hint: Stop button pressed in browser?!]

现在,Windows 8 上的其他浏览器(如 IE11 和 Chrome)也会在服务器日志中生成相同的错误,但它们好像内置了重试逻辑,并会继续运行。我们尝试了所有能想到的方法:

  • 将 SSLCipherSuite 更改为各种字符串。
  • 禁用 TLS v1.1 和 v1.2
  • 从 apache 提供本地内容,而不是通过 mod_proxy 到达后端应用程序服务器的内容。
  • 关闭 KeepAlive

当我们使用 Qualys SSL Lab 扫描服务器时,显示与除 IE6/XP 和 Java 6 之外的所有内容兼容,并得分为 A。

这几乎就像 Windows 在重用 SSL 连接或其他方面存在问题。在 Windows 8 上看不到 FireFox 的任何错误,因为它使用自己的库而不是 SChannel。

任何帮助是极大的赞赏!

谢谢,乔纳森

更新 1 - 2015/03/25

我们认为,部分问题可能是由 RedHat 完成的反向移植密码工作以及与 Apache 2.2 或 Mod_SSL 中的某些内容不兼容引起的。有很多变动部件。我们决定咬紧牙关,在 Apache 2.4 上构建 CentOS 7,因为与 6.6 分支相比,它更新了 Mod_SSL 和 OpenSSL 库。这似乎已经修复了我们看到的所有 Windows 8 SChannel 错误。我怀疑 RedHat 最终会注意到这一点,并最终会针对该问题发布修复程序。

更新 2 - 2015/03/25 无法让 IE10 在 CentOS 7 服务器上出现 SChannel 错误,但一些 .Net 客户端仍报告如下错误:

[Fiddler] 与 secure.hot.com 的连接失败。System.Security.SecurityException
无法与 server.fiddler.network.https> 协商 HTTPS 连接。与 secure.ultracart.com 的 HTTPS 握手失败。System.Security.Authentication.AuthenticationException 对 SSPI 的调用失败,请参阅内部异常。< 登录尝试失败

更新3 - 2015/03/27 事实证明,执行协议检查的 Web 服务器前面的防火墙不喜欢 Windows 8 发送的 TLS 数据包,因此终止了流量。

相关内容