使用Java调用SLB的HTTPS 的技术问题:
描述与:相同Java代码调用公司F5配置的https正常,但调用SLB配置的https报错,见后面备注
备注:
1、浏览器访问https都正常
2、访问地址正常
3、SSL证书配置正确
3、java代码的错误
org.apache.cxf.interceptor.Fault: Received fatal alert: handshake_failure
at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:113)
at org.apache.cxf.wsdl.interceptors.BareOutInterceptor.handleMessage(BareOutInterceptor.java:69)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:516)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:425)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:326)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:279)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:138)
at $Proxy37.checkIdentityWithPhoto(Unknown Source)
at test.TestSelf.main(TestSelf.java:63)
Caused by: com.ctc.wstx.exc.WstxIOException: Received fatal alert: handshake_failure
at com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:255)
at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:111)
... 10 more
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
用户使用Java代码调用SLB配置的HTTPS服务时遇到错误,具体报错信息为Received fatal alert: handshake_failure
,而相同的Java代码能够成功调用公司F5配置的HTTPS服务,且通过浏览器访问SLB配置的HTTPS地址无异常。
1. SSL/TLS握手失败:此错误通常表明客户端(Java应用)与服务器之间的SSL/TLS握手过程中出现问题,可能原因包括但不限于: - 证书不受信任:Java客户端未将SLB服务器证书的根CA或中间证书视为可信。 - 加密套件不兼容:客户端与服务器支持的加密套件不匹配,导致握手无法完成。 - 协议版本不兼容:客户端尝试使用的SSL/TLS协议版本不受服务器支持。
检查JVM信任库: 确认Java应用的JVM是否包含了SLB服务器证书链中的所有必要证书。如果缺少,请下载SLB证书的根CA和任何必要的中间证书,并将其添加到JVM的信任存储库中(默认位于$JAVA_HOME/jre/lib/security/cacerts)。操作命令示例:
keytool -import -trustcacerts -file downloaded_ca_cert.crt -alias myserverca -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
调整SSL/TLS配置: 在Java客户端代码或CXF框架配置中,尝试指定兼容的SSL/TLS协议版本及加密套件,确保它们与SLB服务端配置相匹配。例如,可以通过系统属性或CXF的SSL配置来实现:
System.setProperty("https.protocols", "TLSv1.2,TLSv1.3");
// 或在CXF客户端配置中指定
TLSClientParameters params = new TLSClientParameters();
params.setSecureSocketProtocol("TLSv1.2");
// 设置支持的加密套件列表
List<String> ciphers = Arrays.asList("TLS_AES_128_GCM_SHA256", "TLS_AES_256_GCM_SHA384", ...);
params.setCipherSuites(ciphers.toArray(new String[0]));
日志分析与调试: 开启Java SSL调试日志,以便更详细地了解握手失败的具体原因。可以在启动Java应用时添加以下JVM参数:
-Djavax.net.debug=ssl:handshake
这将输出SSL握手过程的详细信息,帮助定位问题所在。
验证服务端配置: 考虑到浏览器访问正常,但Java客户端调用出错,对比F5与SLB的HTTPS配置差异,特别是查看SLB是否正确配置了所需的加密套件和支持的SSL/TLS版本。
根据上述分析与建议,解决Java客户端调用SLB HTTPS服务时的握手失败问题,需从证书信任、SSL/TLS配置兼容性以及详细的日志分析入手进行排查与修正。