我们的合作伙伴之一是使用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清除了这些,但没有解决实际问题。
最后,我发现了两个修复:
通过将SSLVerifyClient移动到VirtualHost上下文来摆脱SSL重新协商。 由于VirtualHost下的其余资源并不打算在客户端身份validation之下,这意味着要为一个资源设置单独的主机。
注释掉BrowserMatch ".\*MSIE.\*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0我担心删除它会导致意想不到的后果。
问题是,哪种解决scheme更好? 或者还有另外一个? 如果这个网站将永远不会有生活和呼吸的用户,删除BrowserMatch设置有多大的风险?
1.)因此推荐,所以#1是一个好主意。