场景:使用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个)的密钥库会有所不同。