第二次请求触发javax.net.ssl.SSLHandshakeException问题排查求助
这个场景我碰到过好多次了——首次请求正常、第二次就抛SSL握手失败,核心原因基本都和SSL会话复用或者WebLogic的SSL缓存机制有关,毕竟第一次能成功握手,说明你添加的证书是有效的,问题出在后续的连接处理上。下面是具体的排查和解决思路:
排查与解决步骤
1. 先验证SSL会话复用的问题
WebLogic默认会启用SSL会话复用(Session Reuse)来减少握手开销,但如果后端服务不支持会话复用、或者会话超时时间设置过短,第一次请求后会话失效,第二次请求尝试复用失效会话就会触发握手失败。
可以先尝试禁用会话复用来验证:
- 登录WebLogic控制台,找到目标服务器实例 → 「SSL」→ 「高级」选项卡
- 将「Enable Session Tickets」设为
false,同时把「Session Cache Size」调整为0 - 重启服务器后测试第二次请求是否正常
或者直接在启动脚本中添加JVM参数:
-Dweblogic.security.SSL.sessionCache.size=0 -Dweblogic.security.SSL.enableSessionTickets=false
2. 开启SSL调试日志定位具体原因
要精准找到第二次握手失败的根因,必须看详细的SSL交互日志。在WebLogic启动脚本中添加以下JVM参数:
-Djavax.net.debug=ssl,handshake,verbose
重启服务器后触发两次请求,重点查看第二次握手的日志:
- 是否出现「会话复用请求被后端拒绝」的提示
- 还是证书验证环节出现新错误(比如后端服务切换了证书,但WebLogic缓存了旧会话信息)
3. 确认证书库的有效性与加载路径
虽然第一次请求成功,但也要确保WebLogic确实在使用你更新后的证书库:
- 检查WebLogic启动时的JVM参数,确认
-Djavax.net.ssl.trustStore和-Djavax.net.ssl.trustStorePassword指向的是你更新过的证书库(而非默认的JRE cacerts或WebLogic自带信任库) - 用
keytool -list -keystore <你的证书库路径>命令,确认目标证书存在且有效期正常
4. 检查后端服务的SSL配置
有可能是后端服务的策略导致二次握手失败:
- 后端是否限制了同一客户端的会话复用次数?
- 后端的SSL会话超时时间是否设置得极短(比如几秒)?
- 后端是否启用了SNI(Server Name Indication),但WebLogic未配置?如果是这种情况,需要添加JVM参数:
-Dweblogic.security.SSL.enableSNI=true
5. 版本兼容性排查
如果你的WebLogic版本较旧(比如12c之前),搭配的JDK版本也偏老(比如JDK 8u181及之前),可能存在已知的SSL会话复用bug。可以尝试:
- 升级JDK到最新的8u稳定版本(比如8u381)
- 安装WebLogic对应的官方补丁(可搜索Oracle Bug数据库中类似「SSL handshake failure second request」的问题)
内容的提问来源于stack exchange,提问作者user3229808
相关产品推荐
相关产品推荐

