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

Java11+BouncyCastle1.72实现TLS1.3遇internal_error(80)如何解决?

TLS 1.3服务端实现报错:TLS 1.3 credentials unhandled

场景与代码

在Java 11环境下使用BouncyCastle 1.72版本实现TLS 1.3服务端,继承AbstractTLSServer并重写getCipherSuites方法,代码如下:

public int[] getCipherSuites() {
  return Arrays.concatenate(super.getCipherSuites(),
            new int[]
                    {
                            CipherSuite.TLS_RSA_WITH_AES_256_GCM_SHA384,
                            CipherSuite.TLS_CHACHA20_POLY1305_SHA256,
                            CipherSuite.TLS_AES_256_GCM_SHA384,
                            CipherSuite.TLS_AES_128_GCM_SHA256,
                            CipherSuite.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
                            CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
                            CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
                            CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
                            CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
                            CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
                            CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
                            CipherSuite.TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
                            CipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
                            CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
                            CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
                            CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
                            CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
                            CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
                            CipherSuite.TLS_RSA_WITH_AES_128_GCM_SHA256,
                            CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256,
                            CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA256,
                            CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA,
                            CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA
                    });
}

运行异常

运行时抛出如下致命告警:

org.bouncycastle.tls.TlsFatalAlert: internal_error(80); TLS 1.3 credentials unhandled - [MyApp L14 MyApp.run]

解决方案

1. 清理TLS 1.3不兼容的加密套件

TLS 1.3已废弃纯RSA密钥交换的套件(如TLS_RSA_WITH_AES_256_GCM_SHA384)以及所有CBC模式套件(如TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384),这些套件会导致BouncyCastle无法匹配TLS 1.3的凭证处理逻辑,触发内部错误。

修改getCipherSuites方法,仅保留TLS 1.3标准支持的套件:

public int[] getCipherSuites() {
    return new int[] {
            CipherSuite.TLS_AES_256_GCM_SHA384,
            CipherSuite.TLS_AES_128_GCM_SHA256,
            CipherSuite.TLS_CHACHA20_POLY1305_SHA256,
            CipherSuite.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
            CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
            CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
            CipherSuite.TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
            CipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
            CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
    };
}

2. 适配TLS 1.3的凭证配置

TLS 1.3要求服务端使用支持密钥交换的凭证:

  • 优先使用EC密钥对(如secp256r1、secp384r1曲线),这类密钥天然适配TLS 1.3的密钥交换逻辑;
  • 若使用RSA证书,需确保在实现getCredentials方法时,返回支持SHA-256及以上签名算法的RsaCredentials实例,避免仅支持旧签名算法的配置。

3. 避免混合默认套件

不要通过Arrays.concatenate将自定义套件追加到super.getCipherSuites(),默认套件可能包含大量TLS 1.3不兼容的旧版本套件,直接返回筛选后的兼容套件即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:02:24