使用RAD搭配WebSphere 8.0.0.9时遭遇SSL握手失败错误求助
我之前在WebSphere 8.0.0.9搭配RAD做开发时,也碰到过完全一样的javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure错误,给你整理几个经过验证的排查和解决方向:
1. 确认SSL协议版本兼容性
WebSphere 8.0默认启用的SSL协议比较老旧(比如SSLv3、TLSv1.0),如果你的应用要调用的目标服务已经禁用了这些不安全的旧协议,就会直接触发握手失败。调整步骤:
- 登录WebSphere管理控制台,依次进入 安全 > SSL证书和密钥管理 > SSL配置 > 你的SSL配置(比如DefaultSSLSettings) > 质量保护(QoP)设置
- 将“协议”字段修改为目标服务支持的版本,比如
TLSv1.1,TLSv1.2(优先选TLSv1.2) - 保存配置后重启WebSphere服务器
2. 检查信任库是否包含目标服务证书
握手失败最常见的原因之一就是WebSphere的信任库没有信任目标服务的SSL证书,导致无法验证对方身份:
- 先导出目标服务的SSL证书:用浏览器访问目标服务的HTTPS地址,从地址栏的锁图标里导出证书为
.cer格式 - 打开WebSphere安装目录下的
<WAS_HOME>/bin/ikeyman.bat(Windows)或ikeyman.sh(Linux)工具 - 打开WebSphere的默认信任库:路径一般是
<WAS_HOME>/profiles/你的服务器名/etc/trust.p12,默认密码是WebAS - 导入刚才导出的
.cer证书到信任库,选择“信任该证书”,然后保存修改 - 重启服务器后再测试
3. 调整JVM的JSSE配置
WebSphere 8.0使用IBM JDK,有时候默认的JSSE实现会限制协议或算法,需要手动配置:
- 登录控制台,进入 服务器 > 服务器类型 > WebSphere应用服务器 > 你的服务器 > Java和进程管理 > 进程定义 > Java虚拟机
- 在“通用JVM参数”中添加以下参数:
-Dcom.ibm.jsse2.overrideDefaultTLS=true -Dhttps.protocols=TLSv1.1,TLSv1.2 -Dcom.ibm.jsse2.disableSSLv3=true - 保存并重启服务器
4. 启用SSL调试日志定位细节
如果以上方法都没解决问题,开启SSL调试日志能帮你找到具体的失败原因(比如是密钥交换算法不支持、证书链不完整等):
- 在JVM参数中添加调试参数:
-Djavax.net.debug=ssl:handshake:verbose - 重启服务器后触发错误,然后查看
<WAS_HOME>/profiles/你的服务器名/logs/你的服务器名/SystemOut.log,里面会有详细的握手过程日志,根据日志里的错误提示针对性解决
你遇到的错误日志:
[7/5/2018 12:27:46:973 EEST] 0000002d webapp E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[gr.mess.web.servlets.LoginServlet]: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure at com.ibm.jsse2.o.a(o.java:32) at com.ibm.jsse2.o.a(o.java:3) at com.ibm.jsse2.SSLSocketImpl.b(SSLSocketImpl.java:817) at com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:500) at com.ibm.jsse...
内容的提问来源于stack exchange,提问作者UnitTest404

