在生產環境中,SFTP 文件上傳功能突然失效,拋出 java.lang.NoClassDefFoundError: Could not initialize class sun.security.ec.SunEC 異常。經排查,根因是客戶環境升級至 OpenJDK 1.7.0_111,導致安全提供者缺失。
Caused by: java.lang.NoClassDefFoundError: Could not initialize class sun.security.ec.SunEC
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java version "1.7.0_111" OpenJDK Runtime Environment (rhel-2.6.7.2.el6_8-x86_64 u111-b01) OpenJDK 64-Bit Server VM (build 24.111-b01, mixed mode)
OpenJDK 因版權限制,移除了 Oracle JDK 中的部分加密實現(如 SunEC),改用 NSS (Network Security Services) 作為替代。然而,系統自帶的 NSS 版本過舊(3.14.3),不支持所需的加密算法,導致 SunEC 類無法初始化。
參考 Red Hat Bugzilla: #1332867
在客戶服務器上將 NSS 升級至 3.21 或更高版本,具體包包括:
升級命令示例(RHEL/CentOS):
yum update nss nss-softokn-freebl nss-tools
升級完成後重啟應用服務,SFTP 上傳功能恢復正常。
SunEC.jar 到 jre/lib/ext:OpenJDK 運行時不會加載該類,且可能引發簽名驗證失敗。