在apache中禁用keepalives时,MS客户端拒绝SSL重新协商

我们的合作伙伴之一是使用Microsoft Web Services 2.0通过Apache HTTPD 2.0反向代理连接到我们的Web服务。 他们正在发布的资源需要客户端(相互)SSL身份validation:

<Location /SecuredArea> SSLVerifyClient require SSLDepth 10 SSLCACertificatePath /path/to/clientcas SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \ and %{SSL_CLIENT_S_DN_CN} in { "List", "of", "accepted" "names" } \ } </Location> 

不久我们注意到,距离不到1分钟的请求将会失败。 返回的Web客户端Could not create SSL/TLS secure channel

Apache的错误日志显示:

 [debug] ssl_engine_kernel.c(1893): OpenSSL: Write: SSLv3 read client hello B [debug] ssl_engine_kernel.c(1912): OpenSSL: Exit: error in SSLv3 read client hello B [error] [client 12.34.56.78] Re-negotiation handshake failed: Not accepted by client!? 

访问日志显示:

 12.34.56.78 - - [11/Jan/2010:13:58:39 -0500] "POST /SecuredArea HTTP/1.1" 403 - "-" "Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3603)" 

由于合作伙伴连接到其他几个没有问题的网站,他们没有兴趣排除故障。 我不知道他们的其他同伴是如何configuration的,甚至是他们正在运行的。

我尝试了这个Apache错误的所有解决方法,包括将testing服务器升级到Apache 2.2。

我还看到由大会话大小引起的进程间会话caching中的坏PUT。 从dbm更改SSLSessionCache到shmcb清除了这些,但没有解决实际问题。

最后,我发现了两个修复:

  1. 通过将SSLVerifyClient移动到VirtualHost上下文来摆脱SSL重新协商。 由于VirtualHost下的其余资源并不打算在客户端身份validation之下,这意味着要为一个资源设置单独的主机。

  2. 注释掉BrowserMatch ".\*MSIE.\*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0我担心删除它会导致意想不到的后果。

问题是,哪种解决scheme更好? 或者还有另外一个? 如果这个网站将永远不会有生活和呼吸的用户,删除BrowserMatch设置有多大的风险?


1.)因此推荐,所以#1是一个好主意。