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

Oracle Java 11.0.17 TLS 1.3客户端认证无可用认证方案问题排查

TLS 1.3客户端认证报错“no available authentication scheme”(Java 11.0.17客户端 + 11.0.18服务端)

问题详情

  • 环境:Oracle Java 11.0.17客户端,Java 11.0.18服务端,启用客户端证书认证
  • 核心现象:强制使用TLS 1.3时,客户端抛出no available authentication scheme错误;切换为TLS 1.2后握手正常,且即使客户端Hello消息声明支持TLS 1.3,服务端始终返回TLS 1.2版本
  • 证书验证:客户端与服务端证书算法均为SHA256withRSA,已通过keytool -list命令及SSL verbose日志确认
  • 日志细节:
    • TLS 1.2握手成功场景:服务端请求客户端证书后,会依次提示Unavailable authentication scheme: ecdsa_secp256r1_sha256等EC系列算法不可用,最终匹配到可用认证方案
    • TLS 1.3握手失败场景:除EC系列算法外,还会出现Unavailable authentication scheme: rsa_pss_rsae_sha256提示,最终无可用算法导致失败;两种场景下ECDH服务端密钥交换消息的签名算法均为rsa_pss_rsae_sha256

原因分析

Java 11不同小版本对TLS 1.3客户端认证的算法支持存在兼容性差异:

  1. TLS 1.3协议规范中,RSA证书的客户端认证默认优先使用RSA-PSS签名算法,但Java 11.0.17客户端未实现该算法与SHA256withRSA证书的适配逻辑
  2. 服务端Java 11.0.18在TLS 1.3握手时,会发送包含RSA-PSS的签名算法列表,但客户端11.0.17无法匹配,导致无可用认证方案
  3. TLS 1.2中rsa_pss_rsae_sha256仅作为密钥交换的签名算法存在,校验逻辑更宽松;而TLS 1.3对客户端认证的算法匹配要求更严格,两者逻辑不兼容

解决方案

1. 升级客户端Java版本至11.0.18及以上

Java 11.0.18修复了TLS 1.3下RSA证书与RSA-PSS算法的适配问题,升级后可直接兼容,无需额外配置

2. 强制指定兼容的签名算法列表

通过JVM参数限制握手时使用的签名算法,排除客户端不支持的RSA-PSS系列:

  • 在客户端或服务端添加以下JVM参数:
    # 指定TLS 1.3 cipher套件
    -Djdk.tls.client.cipherSuites=TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256,TLS_AES_128_GCM_SHA256
    -Djdk.tls.server.cipherSuites=TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256,TLS_AES_128_GCM_SHA256
    # 指定签名算法为传统RSA-PKCS1系列
    -Djdk.tls.signatureSchemes=rsa_pkcs1_sha256,rsa_pkcs1_sha384,rsa_pkcs1_sha512
    

3. 临时降级至TLS 1.2(应急方案)

若暂时无法升级或修改配置,可在客户端强制指定TLS版本为1.2:

-Djdk.tls.client.protocols=TLSv1.2

或在服务端配置中限制仅启用TLS 1.2协议

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:43:31