我们的合作伙伴之一正在使用 Microsoft Web Services 2.0 通过 Apache HTTPD 2.0 反向代理连接到我们的 Web 服务。他们发布到的资源需要客户端(相互)ssl 身份验证:
<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)"
由于合作伙伴可以毫无问题地连接到其他几个站点,因此他们对排除故障不感兴趣。我不知道他们的其他对等方是如何配置的,甚至他们正在运行什么。
我尝试了这个 apache 错误的所有解决方法,包括将测试服务器升级到 Apache 2.2。
我还在进程间会话缓存中看到了由大会话大小引起的错误 PUT。从 dbm更改SSLSessionCache
为 shmcb 清除了这些,但没有解决实际问题。
最后,我找到了两个修复:
SSLVerifyClient
通过移动到VirtualHost
上下文摆脱 SSL 重新协商。由于 VirtualHost 下的其余资源不打算进行客户端身份验证,这意味着为一个资源设置单独的主机。注释掉
BrowserMatch ".\*MSIE.\*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
我担心删除它会在未来产生意想不到的后果。
问题是,这些解决方案中哪个更好?还是还有一个?如果这个网站永远不会有活生生的用户,那么删除这些BrowserMatch
设置的风险有多大?
1.) 是因为这个而被推荐的,所以无论如何#1 是一个好主意。