Contents

在Java 7中启用TLS v1.2

1. 概述

**当谈到 SSL 连接时,我们应该使用 TLSv1.2。**实际上,它是 Java 8 的默认 SSL 协议。 虽然 Java 7 支持 TLSv1.2,但 默认的是 TLS v1.0,现在它太弱了。 在本教程中,我们将讨论配置 Java 7 以使用 TLSv1.2 的各种选项。

2. 使用 Java VM 参数

如果我们使用 Java 1.7.0_95 或更高版本,我们可以添加 jdk.tls.client.protocols 属性作为java 命令行参数以支持 TLSv1.2:

java -Djdk.tls.client.protocols=TLSv1.2 <Main class or the Jar file to run>

但是 Java 1.7.0_95 只提供给从 Oracle 购买支持的客户。因此,我们将在下面查看其他选项以在 Java 7 上启用 TLSv1.2。

3. 使用SSLSocket

在第一个示例中,我们将使用SSLSocketFactory 启用 TLSv1.2。 首先,我们可以通过调用SSLSocketFactory#getDefault工厂方法来创建一个默认的SSLSocketFactory对象 。 然后,我们只需将我们的主机和端口传递给SSLSocket#createSocket

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

上面创建的默认SSLSocket没有与之关联的任何 SSL 协议。我们可以通过几种方式将 SSL 协议关联到我们的 SSLSocket。 在第一种方法中,我们可以将支持的 SSL 协议数组传递给SSLSocket实例上的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 ”作为参数。我们现在可以从中获取我们的 SSLSocketFactory  :

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

当然,我们并不总是直接创建套接字。通常,我们处于应用程序协议级别。

所以,最后,让我们看看如何在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());