在Java 7中启用TLS v1.2

2023/07/02

1. 概述

当涉及到SSL连接时,我们应该使用TLSv1.2。实际上,它是Java 8的默认SSL协议。

虽然Java 7支持TLSv1.2,但默认的是TLSv1.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());

6. 总结

在这篇简短的文章中,我们展示了几种在Java 7上启用TLSv1.2的方法。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章