You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从JDK8迁移至JDK17后,如何禁用X448椭圆曲线?

在JDK17中禁用X448椭圆曲线的有效方法

你从JDK8迁移到JDK17后,遇到服务器对外暴露X448椭圆曲线的问题,之前尝试通过代码设置jdk.tls.namedGroups和jdk.disabled.namedGroups系统属性未生效,以下是几种可行的解决方法:

方法一:通过JVM启动参数指定允许的椭圆曲线

直接在JVM启动时添加参数,确保TLS组件初始化时就读取配置,避免代码设置时机过晚的问题:

-Djdk.tls.namedGroups="prime256v1,secp384r1,secp521r1,X25519"

或者通过禁用指定曲线的方式:

-Djdk.disabled.namedGroups="X448"

注意:启动参数的引号格式需符合操作系统要求(Windows用双引号,Linux/macOS可省略或用单引号)。

方法二:在代码中提前设置系统属性

如果必须在代码中设置,务必在任何SSL相关组件初始化之前执行,比如放在main方法的第一行:

public static void main(String[] args) {
    // 先设置系统属性,再初始化其他组件
    System.setProperty("jdk.tls.namedGroups", "prime256v1,secp384r1,secp521r1,X25519");
    // 或者禁用X448
    // System.setProperty("jdk.disabled.namedGroups", "X448");
    
    // 后续的应用初始化逻辑
    SpringApplication.run(YourApp.class, args);
}

之前的设置无效大概率是因为设置时机太晚,SSLContext已经完成初始化,此时修改系统属性不会影响已加载的配置。

方法三:自定义SSLContext配置椭圆曲线

如果上述方法不适用,可以手动创建SSLContext并指定允许的椭圆曲线,再将其应用到服务器的SSL组件:

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLServerSocketFactory;
import java.security.NoSuchAlgorithmException;

public class SslConfig {
    public static SSLServerSocketFactory getCustomSslServerSocketFactory() throws NoSuchAlgorithmException {
        SSLContext sslContext = SSLContext.getInstance("TLSv1.3");
        sslContext.init(null, null, null);
        
        SSLParameters params = sslContext.getDefaultSSLParameters();
        // 指定允许的椭圆曲线,排除X448
        params.setNamedGroups(new String[]{"prime256v1", "secp384r1", "secp521r1", "X25519"});
        
        SSLServerSocketFactory factory = sslContext.getServerSocketFactory();
        // 若为服务器端Socket,需将参数绑定到对应的Socket上
        // 示例:serverSocket.setSSLParameters(params);
        return factory;
    }
}

如果使用Tomcat、Jetty等Web容器,可直接在容器配置中指定椭圆曲线列表,比如Tomcat的server.xml:

<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true">
    <SSLHostConfig>
        <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                     type="RSA"
                     ecCurves="prime256v1,secp384r1,secp521r1,X25519"/>
    </SSLHostConfig>
</Connector>

验证配置是否生效

配置完成后,再次使用testssl工具测试,确认输出的Elliptic curves offered列表中不再包含X448即可。

内容的提问来源于stack exchange,提问作者RHYTHM VARSHNEY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:35:22