我们对此感到十分困惑。在升级到运行在 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 数据包,因此终止了流量。