在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());