1. 概述

在 SSL 连接中,我们应该使用 TLSv1.2。 实际上,它已经是 Java 8 的默认 SSL 协议了。

虽然 Java 7 支持 TLSv1.2,但其默认启用的是 TLSv1.0,这个版本现在看来安全性太弱了 ❌。

在本教程中,我们将探讨几种配置 Java 7 使用 TLSv1.2 的方法。

2. 通过 JVM 参数启用

如果你使用的是 Java 1.7.0_95 或更高版本,可以通过添加 jdk.tls.client.protocols 属性作为 java 命令行参数来启用 TLSv1.2:

java -Djdk.tls.client.protocols=TLSv1.2 <Main class 或 Jar 文件>

⚠️ 但注意:Java 1.7.0_95 只对购买了 Oracle 支持服务的客户开放。因此,如果你没有这个版本,就需要看下面的方法。

3. 使用 SSLSocket

在这个示例中,我们通过 SSLSocketFactory 来启用 TLSv1.2。

首先,可以通过 SSLSocketFactory.getDefault() 方法创建一个默认的 SSLSocketFactory 实例

然后,将主机和端口传入 SSLSocket.createSocket() 方法:

SSLSocketFactory socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslSocket = (SSLSocket) socketFactory.createSocket(hosturl, port);

默认创建的 SSLSocket 实例不包含任何 SSL 协议。我们需要手动为其设置协议。

✅ 方法一:调用 setEnabledProtocols 方法:

sslSocket.setEnabledProtocols(new String[] {"TLSv1.2"});

✅ 方法二:使用 SSLParameters

SSLParameters params = new SSLParameters();
params.setProtocols(new String[] {"TLSv1.2"});
sslSocket.setSSLParameters(params);

4. 使用 SSLContext

直接设置 SSLSocket 只会影响单个连接。如果想要更通用的配置,可以使用 SSLContext 来创建 SSLSocketFactory

与直接使用 SSLSocketFactory.getInstance 不同,我们使用 SSLContext.getInstance("TLSv1.2"),并传入 "TLSv1.2" 作为参数:

SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, null, new SecureRandom());
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
SSLSocket socket = (SSLSocket) socketFactory.createSocket(url, port);

📌 小贴士:在处理 SSL 时,**始终使用 SecureRandom**,这是最佳实践。

5. 使用 HttpsURLConnection

很多时候我们并不直接操作 Socket,而是使用更高层的协议,比如 HTTPS。

接下来我们看看如何在 HttpsURLConnection 中启用 TLSv1.2。

首先,我们需要一个 URL 实例,假设我们要连接 https://example.org

URL url = new URL("https://" + hosturl + ":" + port);

接着,像之前一样设置 SSLContext

SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); 
sslContext.init(null, null, new SecureRandom());

最后,打开连接并设置 SSLSocketFactory

HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setSSLSocketFactory(sslContext.getSocketFactory());

6. 总结

在这篇文章中,我们展示了在 Java 7 中启用 TLSv1.2 的几种方式:

  • 使用 JVM 参数(仅限特定版本)
  • 配置 SSLSocket
  • 使用 SSLContext
  • HttpsURLConnection 中指定协议

虽然 Java 7 默认不启用 TLSv1.2,但通过上述方法,我们可以手动启用它,从而提升连接的安全性 ✅。

📌 建议:如果项目允许,尽早升级到 Java 8 或更高版本,以享受更现代、更安全的默认配置。


原始标题:Enabling TLS v1.2 in Java 7 | Baeldung