我们的一个合作伙伴正在使用 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 错误。将SSLSessionCache
dbm 更改为 shmcb 可以清除这些问题,但无法解决实际问题。
最后,我找到了两个解决方法:
SSLVerifyClient
通过移至上下文来摆脱 SSL 重新协商VirtualHost
。由于 VirtualHost 下的其余资源不打算接受客户端身份验证,因此这意味着为一个资源设置单独的主机。注释掉
BrowserMatch ".\*MSIE.\*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
我担心删除它会产生意想不到的后果。
问题是,哪种解决方案更好?或者还有其他解决方案吗?如果这个网站永远不会有活跃的用户,那么删除这些BrowserMatch
设置的风险有多大?
答案1
1.) 推荐的原因这,因此无论如何 #1 都是一个好主意。