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
相关产品推荐
相关产品推荐

