2010-06-11 37 views
1

场景:使用SSL(https)通过相互SSL身份验证调用客户端Web服务。用于测试与生产环境的不同服务端点URL和证书(包括密钥存储和信任存储)。测试和生产环境都运行tomcat/JBoss集群。生产环境具有负载平衡/ BigIP,运行刀片式和非刀片式机器。除非启用SSL调试,否则Web服务SSL握手在生产环境中失败

在启动时设置Truststore(使用-Djavax.net.ssl.trustStore = )。 Keystore是使用Java代码中的System.setProperty(“javax.net.ssl.keyStore”,“value”)设置的。使用Axis2进行Web服务调用。在测试环境中,所有工作都很好,但是当我们转移到生产环境(6台服务器)时,似乎证书不会被转发用于握手。下面是我们做了什么:

  • 在测试环境中,使用证书的测试版本握手就一直合作的所有,不具有SSL的调试启用
  • 证实在测试环境中,与客户的生产握手 端点成功(生产证书, 我们都和他们,都很好) - 这 使用 -Djavax.net.debug =握手,SSL完成
  • 证实,所有6台生产服务器出现错误条件
  • 了一台服务器出于cl uster,只需打开一个(重启),打开 ssl调试,直接打 ,握手就行!
  • 切换到不同的服务器,而无需开启调试, 握手错误情况发生
  • 打开调试上第二个服务器上(与重启),直接打它,握手的作品!

从证据来看,似乎启用调试会导致证书被正确检索/传送,尽管这没有任何意义!我想知道启用的调试是否会使系统关注System.setProperty调用,并忽略它。但是,在本地和测试环境中,握手工作时未启用调试。

我是否需要在服务器启动时设置密钥库,就像我设置信任库一样?一直避免这种情况,因为我们的每个测试环境(其中16个)的密钥库会有所不同。

回答

1

原来,调试设置是一个红鲱鱼。实际上,我们认为有一个现有的客户端具有我们在其中一个用户登录时调用的SSL /基本身份验证Web服务。由于在该上下文中密钥库不相关,因此javax.net.ssl.keyStore属性不会相关没有设置 - 但SSL交换仍然尝试加载密钥库(最终不加载任何证书)。由于不幸的是,即使javax.net.ssl.keyStore的值发生了变化,它也不会被重新加载,因此调用其他客户端的Web服务时不会调用密钥库证书。

解决方案是在服务器启动时设置keyStore属性,而不是在Web服务调用点。如果将来某个时候我们需要能够在不同的上下文中使用不同的keyStore,那么看起来我们需要实现一个自定义的SocketFactory。