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上获得。