几个月以前,我遇到一个客户站点,他们刚刚将其服务器从8.1sp1升级到8.1sp4。很明显,升级过程很成功,在测试时也没遇到大的问题。他们的问题是:升级成功后,他们的许多证书都快要到期了。我们很快意识到更新密钥库将是一项浩大的工程,有3个原因:首先,需要更新的证书和密钥库的数量庞大;其次,构建以及整理过程使得在向相应的密钥库中添加新证书时会产生很大的混乱;最后,获得证书签名的过程令人非常痛苦。
在这项庞大工程完成之后不久,出现了问题的第一个征兆。在峰值负载下,我们发现负载均衡功能不起作用了。集群中的一些服务器在做所有的工作,而其它的服务器则几乎完全是不活动的。我们最初的分析成效不大,所以我们决定使用微软的标准故障排除模式,当天晚上重启所有的WLS和Apache服务器。
接下来的几天很平静,似乎一切都没问题了。我们认为这个问题只是集群中的偶然故障,因为日志中没有什么记录,在测试环境中也没有发生该问题,所以我们就结束了这个个案。当天晚上由于应用程序中的一些线程需要重启两个活动的服务器。重启的两个服务器并没有出现问题的迹象,但是第二天就出现了上述问题的大范围爆发,而且不仅是在活动的环境中,后来几乎所有最近重启过的其它环境都报告了这一问题。这一次,日志中有了错误记录:
####<18-Nov-2005 15:25:22 o'clock GMT> <Warning> <Security> <box1> <server1><main><<WLS Kernel>> <> <BEA-090500><DECRYPT_ERROR alert received from xxxxxxx - x.x.x.x. A decryption error occurred during the SSL handshake.>
我们主要关心的是如何减轻活动服务器上的问题。我们猜测重启集群而不是重启单个的服务器就不会出现解密错误,事实证明确实如此。但是,我们发现,如果有服务器脱离了集群(这可能是由很多原因造成的),那么当该服务器试图重新连入集群中时就会出现解密错误。这些“流浪”的服务器会对集群造成很大损害,因为一个或多个Apache服务器可能会认为它仍然是集群中的一部分,并向该服务器发送请求,然后就会被该服务器告知:它是集群中唯一的服务器。在apache插件配置中启动调试后,就可以检测到该行为。我们必须监视weblogic serverlog的BEA-000112和BEA-000113消息,并关闭任何脱离集群的服务器。
将问题控制在活动服务器上之后,我们试着找出根本原因。主要的疑点集中在密钥库和新证书上。看起来,在使用新证书更新密钥库之后遇到SSL问题并非只是巧合。也许在此过程中我们以某种方式损坏了密钥库。我们使用keytool检查了所有的密钥库、密钥和证书,但是一无所获。
问题持续了六周,我们不辞辛苦地审计所有环境,检查冗长的日志文件。最终我们发现了问题的根源。在升级到WLS 8.1 sp4的过程中,SSL的TwoWaySSLEnabled属性从“Client Certificate Not Requested”变为“Client Certificate Requested But Not Enforced”。这并不是我们更改的,我们还保留了一个被设置为“Client Certificates Not Requested”的8.1 sp1平台,它没有出现任何升级后的环境所发生的症状。config.xml文档说该属性的值只能是true或false,而管理控制台似乎提供了第三种选项:请求并可能实施一个客户端证书!
想知道如果删除了WLS域目录再运行域会出现什么情况吗?在我的下一篇文章“Ghost in the Korn Shell”中,我将介绍在发生了这样的不幸事件之后如何部属域。