自定义Java运行镜像报SSLHandshakeException非自定义运行正常如何解决
问题原因
该问题确实是自定义JRE构建时缺少必要模块导致的。普通完整JRE默认内置了所有加密相关模块,所以运行无异常。jdeps --list-deps仅能扫描代码的静态显式依赖,无法识别SSL/TLS握手过程中动态加载的加密服务实现类(SPI机制加载),你仅添加java.base模块的自定义运行环境缺少核心加密算法实现,导致HTTPS握手失败。
缺失的模块
你需要额外补充jdk.crypto.ec模块:
该模块提供了椭圆曲线加密算法的实现,目前全球绝大多数HTTPS站点的TLS握手都依赖ECDHE、ECDSA这类椭圆曲线算法,而java.base模块仅包含SSL相关的接口定义,没有内置对应算法实现,这是你报错的核心原因。
如果后续涉及非UTF-8编码的响应解析,还可以补充jdk.charsets模块扩展编码支持。
修复方案
修改你bat脚本中的jlink构建命令,在--add-modules参数后补充缺失的模块即可:
:: 原命令 :: jlink --add-modules java.base --output myruntime :: 修改后的命令 jlink --add-modules java.base,jdk.crypto.ec --output myruntime
如果还有其他运行时SPI加载类的缺失问题,可以给jlink添加--bind-services参数,自动扫描绑定所有服务提供者对应的模块:
jlink --add-modules java.base,jdk.crypto.ec --bind-services --output myruntime
修改后重新构建自定义运行环境,即可正常发起HTTPS请求。
内容的提问来源于stack exchange,提问作者hidden_machine
相关产品推荐
相关产品推荐

