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

