从IBM JRE 1.6连接SOAP服务时遇到异常问题
错误原因分析
你碰到的SOAPException: faultCode=SOAP-ENV:Client; msg=Error opening socket: javax.net.ssl.SSLException: java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 64错误,本质是Java 8早期版本的SSL/TLS密码套件处理bug导致的。具体来说,Java 8的SSL引擎在解析超过特定数量(64个)的密码套件时,数组长度定义不足,触发了越界异常——这是Oracle在Java 8后续补丁中修复的经典问题。
可行解决方案
下面按优先级给你几个解决办法:
优先升级Java 8到最新补丁版本
这是最彻底的解决方案。Oracle在Java 8u291及以后的版本中修复了这个SSL密码套件数组越界的问题,你可以把Tomcat运行的JDK升级到jdk1.8.0_291或更高版本(OpenJDK对应的版本也适用)。升级后不需要额外配置,就能自动规避这个bug。手动限制Tomcat的SSL密码套件(临时方案)
如果暂时没法升级JDK,可以在Tomcat的conf/server.xml中,给SSL Connector节点指定经过验证的、数量较少的密码套件列表,避免触发数组越界。示例配置如下:<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true"> <SSLHostConfig protocols="TLSv1.2"> <Certificate certificateKeystoreFile="conf/your-keystore.jks" type="RSA" /> <!-- 指定兼容Java 8早期版本的密码套件,数量控制在64以内 --> <SSLHostConfig ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256" /> </SSLHostConfig> </Connector>配置后重启Tomcat,确保IBM OMS使用的密码套件和这里指定的一致。
检查IBM OMS的SSL配置
确认OMS端使用的SSL协议是TLSv1.2(避免使用过时的TLSv1.0/1.1),并且其密码套件列表不要包含Java 8早期版本无法正确处理的套件。如果OMS允许自定义密码套件,可以和Tomcat端保持一致,减少握手时的兼容性问题。
内容的提问来源于stack exchange,提问作者Azar

