升级至JDK 1.8.0_16X后Keycloak Proxy无法工作的SSL连接问题
这个问题我之前排查过,根源是Java 8u161及以后的版本对SSL内部API做了调整——Oracle移除了sun.security.ssl.SupportedEllipticPointFormatsExtension这个内部类,而旧版本的Keycloak Proxy正好依赖了这个非公开的API,所以升级Java后就会抛出NoClassDefFoundError。
你遇到的异常完整栈信息应该是这样的:
Exception in thread "XNIO-1 task-2" java.lang.NoClassDefFoundError: sun/security/ssl/SupportedEllipticPointFormatsExtension
at sun.security.ssl.HelloExtensions.(HelloExtensions.java:84)
at sun.security.ssl.HandshakeMessage$ClientHello.(HandshakeMessage.java:245)
at sun.security.ssl.ServerHandshaker.processMessage(...)
下面给你几个可行的解决办法:
临时应急:降级Java版本
把Java退回到1.8.0_160或者更早的版本,这个办法最快,能立刻恢复Keycloak Proxy的正常工作,适合需要先恢复服务再做长期规划的场景。长期根治:升级Keycloak到兼容版本
Keycloak官方在后续的版本(比如4.8.3.Final及以后)修复了这个依赖内部API的问题,建议你升级到最新的稳定版,或者至少升级到明确标注支持Java 8u161+的版本。升级前记得备份配置和数据,避免出现意外。特殊场景:修改Proxy代码(不推荐)
如果暂时无法升级Keycloak,你可以尝试修改Keycloak Proxy中依赖这个类的代码,替换成Java公开的SSL API。但这个办法需要你对Keycloak的源码有一定了解,而且后续升级Keycloak时可能会有冲突,所以只作为最后备选。
内容的提问来源于stack exchange,提问作者Laura Ricco




