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

Java19+Jetty9+Camel3迁移遇SSLHandshakeException认证方案缺失问题

问题分析与解决方案

核心原因

Java 11及更高版本(包括你使用的Java 19/GraalVM CE 22.3.0)默认禁用了SHA1等弱签名算法,而你当前用OpenSSL生成的自签名证书,大概率使用了SHA1WithRSA作为签名算法——这会导致SSL握手时,JVM找不到符合安全要求的认证方案,抛出No available authentication scheme错误。

修复步骤

1. 重新生成带强签名算法的证书

修改OpenSSL生成命令,指定使用SHA256签名算法(Java 11+默认支持的强算法):

# 生成带SHA256签名的自签名证书和私钥
openssl req -newkey rsa:2048 -keyout dela.key -x509 -days 36500 -out dela.crt -sha256
# 导出为PKCS12格式
openssl pkcs12 -inkey dela.key -in dela.crt -export -out dela.p12

2. 验证证书签名算法

执行以下命令确认证书使用的是强签名算法:

openssl x509 -in dela.crt -text -noout | grep "Signature Algorithm"

正常输出应为:

Signature Algorithm: sha256WithRSAEncryption

3. 额外配置检查

  • Jetty SSL上下文配置:确保你的Jetty SSLContextFactory明确指定了TLS 1.2或更高版本,并包含支持SHA256的密码套件。例如:
    SslContextFactory sslContextFactory = new SslContextFactory();
    sslContextFactory.setKeyStorePath("path/to/dela.p12");
    sslContextFactory.setKeyStorePassword("your-password");
    sslContextFactory.setKeyStoreType("PKCS12");
    // 指定TLS版本
    sslContextFactory.setIncludeProtocols("TLSv1.2", "TLSv1.3");
    // 确保包含SHA256相关密码套件
    sslContextFactory.setIncludeCipherSuites("TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_RSA_WITH_AES_256_GCM_SHA384");
    
  • GraalVM原生镜像(若使用):如果是构建原生镜像,需确保SSL相关的算法类被正确纳入镜像,可通过添加--enable-all-security-services参数或在reflect-config.json中配置相关类。

为什么之前Java 8正常?

Java 8默认允许SHA1签名算法,且对SSL安全限制更宽松,所以旧证书和配置能正常工作。但Java 11+为了符合安全规范,默认禁用了这类弱算法,导致兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:32:00