当 Apache 中禁用 Keepalive 时,MS 客户端拒绝 SSL 重新协商

当 Apache 中禁用 Keepalive 时,MS 客户端拒绝 SSL 重新协商

我们的一个合作伙伴正在使用 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 错误。将SSLSessionCachedbm 更改为 shmcb 可以清除这些问题,但无法解决实际问题。

最后,我找到了两个解决方法:

  1. SSLVerifyClient通过移至上下文来摆脱 SSL 重新协商VirtualHost。由于 VirtualHost 下的其余资源不打算接受客户端身份验证,因此这意味着为一个资源设置单独的主机。

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

问题是,哪种解决方案更好?或者还有其他解决方案吗?如果这个网站永远不会有活跃的用户,那么删除这些BrowserMatch设置的风险有多大?


答案1

1.) 推荐的原因,因此无论如何 #1 都是一个好主意。

相关内容