TLS 1.3 的密码套件经过严格筛选,仅保留 5 种高强度组合(RFC 8446 定义),其核心特点是强制 AEAD 加密和前向保密。以下是 Java 中如何配置这些套件的详细解析,包含代码示例和最佳实践。
一、TLS 1.3 严选密码套件清单
TLS 1.3 的密码套件格式为 TLS_<加密算法>_<认证方式>_SHA<哈希长度>
,仅支持 AEAD(认证加密)模式,且密钥交换独立于套件(仅 ECDHE/X25519)。以下是官方推荐的 5 种套件:
套件名称 | 加密算法 | 哈希算法 | 适用场景 |
---|---|---|---|
TLS_AES_256_GCM_SHA384 | AES-256-GCM | SHA-384 | 最高安全级别(推荐生产环境) |
TLS_AES_128_GCM_SHA256 | AES-128-GCM | SHA-256 | 平衡安全与性能(通用场景) |
TLS_CHACHA20_POLY1305_SHA256 | ChaCha20-Poly1305 | SHA-256 | 移动设备/无 AES 硬件加速(如 Android) |
TLS_AES_128_CCM_SHA256 | AES-128-CCM | SHA-256 | 特殊硬件需求(极少使用) |
TLS_AES_128_CCM_8_SHA256 | AES-128-CCM-8(短标签) | SHA-256 | 资源严格受限设备(不推荐) |
🔐 选择建议:
- 优先
TLS_AES_256_GCM_SHA384
(最高安全)和TLS_CHACHA20_POLY1305_SHA256
(移动优化)。- 避免使用
CCM_8
(8 字节认证标签易受篡改)。
二、Java 对 TLS 1.3 的支持
Java 从 JDK 8u261 开始正式支持 TLS 1.3(需确认 JDK 版本:java -version
),但默认未启用。需显式配置启用 TLS 1.3 及指定密码套件。
关键类与方法
SSLContext
:创建 SSL 上下文,配置协议和密码套件。SSLSocketFactory
:基于 SSL 上下文生成 Socket 工厂。HttpsURLConnection
:HTTP 客户端(需设置 SSLSocketFactory)。- Spring Boot:通过
application.properties
配置服务器端 SSL。
三、Java 客户端代码示例(启用 TLS 1.3 及指定套件)
以下示例展示如何在 Java 客户端(如 HttpsURLConnection
)中启用 TLS 1.3 并指定密码套件。
1. 基础客户端配置
import javax.net.ssl.*;
import java.security.SecureRandom;
import java.net.URL;
public class TLS13Client {
public static void main(String[] args) throws Exception {
// 1. 创建 SSLContext(TLS 1.3)
SSLContext sslContext = SSLContext.getInstance("TLSv1.3");
// 2. 初始化 SSLContext(使用系统默认信任管理器)
sslContext.init(
null, // 密钥管理器(无客户端证书时为 null)
null, // 信任管理器(使用系统默认)
new SecureRandom()
);
// 3. 获取 SSLSocketFactory
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
// 4. 配置 HttpsURLConnection
URL url = new URL("https://example.com");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(sslSocketFactory);
// 5. 可选:显式设置启用的密码套件(覆盖默认)
String[] enabledCiphers = {
"TLS_AES_256_GCM_SHA384",
"TLS_CHACHA20_POLY1305_SHA256"
};
conn.setEnabledCipherSuites(enabledCiphers);
// 6. 发送请求并读取响应
System.out.println("Response Code: " + conn.getResponseCode());
}
}
2. 关键说明
- 协议版本:
SSLContext.getInstance("TLSv1.3")
显式指定使用 TLS 1.3。 - 密码套件:
setEnabledCipherSuites()
方法覆盖默认套件,仅保留需要的 TLS 1.3 套件。 - 信任管理器:若需自定义 CA 证书,可替换为
X509TrustManager
实现(如加载自签名证书)。
四、Java 服务器端代码示例(Spring Boot 配置)
在 Spring Boot 中,可通过 application.properties
或编程方式配置 TLS 1.3 及密码套件。
1. application.properties 配置
# 启用 HTTPS
server.port=8443
server.ssl.key-store-type=PKCS12
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=your-password
server.ssl.key-alias=tomcat
# 启用 TLS 1.3 并指定密码套件
server.ssl.enabled-protocols=TLSv1.3
server.ssl.ciphers=TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256
2. 编程方式配置(高级场景)
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.net.ssl.SSLContext;
import java.util.Arrays;
@Configuration
public class TomcatConfig {
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return factory -> {
factory.addConnectorCustomizers(connector -> {
// 创建 SSLContext(TLS 1.3)
SSLContext sslContext = SSLContext.getInstance("TLSv1.3");
sslContext.init(
null, // 密钥管理器(使用服务器证书)
null, // 信任管理器(系统默认)
new SecureRandom()
);
// 配置连接器
connector.setProtocol("org.apache.coyote.http11.Http11NioProtocol");
connector.setSSLEnabled(true);
connector.setSSLContext(sslContext);
connector.setEnabledProtocols(new String[]{"TLSv1.3"});
connector.setCipherSuites(new String[]{
"TLS_AES_256_GCM_SHA384",
"TLS_CHACHA20_POLY1305_SHA256"
});
});
};
}
}
五、验证配置是否生效
通过以下工具验证 TLS 1.3 及密码套件是否正确配置:
1. 在线测试(SSL Labs)
访问 SSL Labs 测试页面,输入域名后检查:
- 协议支持:显示
TLS 1.3
(推荐)。 - 密码套件:仅列出配置的 TLS 1.3 套件(如
TLS_AES_256_GCM_SHA384
)。
2. 命令行测试(OpenSSL)
# 检查服务器支持的 TLS 版本和套件
openssl s_client -connect example.com:443 -tls1_3 -cipher TLS_AES_256_GCM_SHA384
输出应包含 Verify return code: 0 (ok)
,表示连接成功。
六、注意事项
-
JDK 版本限制:
- JDK 8u261+ 支持 TLS 1.3,但部分旧版本(如 8u201)需手动安装补丁。
- JDK 11+ 对 TLS 1.3 的支持更完善(推荐升级)。
-
密码套件兼容性:
- 客户端与服务器需共同支持至少一个密码套件,否则握手失败。
- 移动设备(如 iOS/Android)优先选择
TLS_CHACHA20_POLY1305_SHA256
(避免 AES 硬件缺失问题)。
-
性能优化:
AES-GCM
利用 CPU 指令(如 Intel AES-NI)加速,适合服务器端。ChaCha20-Poly1305
纯软件实现,适合无 AES 加速的嵌入式设备。
总结
TLS 1.3 的密码套件通过严格筛选确保了安全性与性能,Java 中通过显式配置 SSLContext
和密码套件即可启用。实际部署时需根据客户端环境(如移动设备)调整套件优先级,并通过在线工具验证配置有效性。