我是一名 IIS 管理员。我尽我所能查阅了 mod_ssl 文档、谷歌等,但找不到遇到过我这个问题的人,更不用说找到解决方案了。当然,这让我怀疑我是否理解正确,但我在 WireShark 跟踪中清楚地看到了这一点。
我遇到了与慢速 IIS 服务器的竞争条件。IIS 服务器成功通过 TLS 连接到我的 Apache 服务器,并发送加密请求。Apache 服务器成功响应,IIS 服务器通常一切顺利。5 秒后,Apache 服务器传输 TLS Rec Layer-1 加密警报,TLS 对话终止。不过,有时,当客户端服务器通过现有的开放 TLS 通道提交第二个或第三个加密请求时,协商会变得复杂。1000 次中有 999 次,所有这些协商都是完美的。
1000 次中有 1 次,缓慢的 IIS 服务器需要 5 秒钟才能决定发送额外的加密请求(TLS 应用程序数据)。发生这种情况时,加密请求会在线路上越过 TLS Rec 第 1 层加密警报,导致“底层连接已关闭:连接意外关闭”。
我在 mod_ssl 中没有看到任何允许我延长 5 秒对话超时的指令。我忽略了什么?
我可以修改 SSLSessionCacheTimeout 指令,但这对任何特定对话的 5 秒超时没有影响。有其他人见过这种行为吗?
答案1
听起来每个应用程序请求都是一个单独的 HTTP 调用 —— 在这种情况下我们的罪魁祸首很可能是KeepAliveTimeout
—— 其默认值恰好是 5 秒。
完全关闭 HTTP keep-alive 可以解决这个问题,但也会损害性能,因为每个请求都需要新的 TCP 然后是 TLS 握手。相反,如果将超时时间增加到一分钟或更长,是否不太可能出现线路交叉竞争条件 - 或者应用程序是否一直在发送请求?只要 Apache 服务器没有获得大量连接,增加此值就不会有任何损害。
也许只是尝试:
KeepAliveTimeout 120