开发者社区 问答 正文

使用Java调用SLB的HTTPS 的技术问题

使用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

展开
收起
苦行僧 2015-12-17 11:38:30 7905 分享
分享
版权
举报
阿里云 AI 助理回答

问题描述

用户使用Java代码调用SLB配置的HTTPS服务时遇到错误,具体报错信息为Received fatal alert: handshake_failure,而相同的Java代码能够成功调用公司F5配置的HTTPS服务,且通过浏览器访问SLB配置的HTTPS地址无异常。

原因分析

1. SSL/TLS握手失败:此错误通常表明客户端(Java应用)与服务器之间的SSL/TLS握手过程中出现问题,可能原因包括但不限于: - 证书不受信任:Java客户端未将SLB服务器证书的根CA或中间证书视为可信。 - 加密套件不兼容:客户端与服务器支持的加密套件不匹配,导致握手无法完成。 - 协议版本不兼容:客户端尝试使用的SSL/TLS协议版本不受服务器支持。

解决步骤

  1. 检查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
    
  2. 调整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]));
    
  3. 日志分析与调试: 开启Java SSL调试日志,以便更详细地了解握手失败的具体原因。可以在启动Java应用时添加以下JVM参数:

    -Djavax.net.debug=ssl:handshake
    

    这将输出SSL握手过程的详细信息,帮助定位问题所在。

  4. 验证服务端配置: 考虑到浏览器访问正常,但Java客户端调用出错,对比F5与SLB的HTTPS配置差异,特别是查看SLB是否正确配置了所需的加密套件和支持的SSL/TLS版本。

注意事项

  • 备份配置:在修改任何生产环境的配置前,请先做好相关配置的备份。
  • 测试环境验证:在生产环境实施变更前,建议先在测试环境中验证解决方案的有效性。

结论

根据上述分析与建议,解决Java客户端调用SLB HTTPS服务时的握手失败问题,需从证书信任、SSL/TLS配置兼容性以及详细的日志分析入手进行排查与修正。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答