Java HttpsURLConnection和TLS 1.2
我在一篇文章中读到HttpsURLConnection
将透明地协商SSL连接。
官方文件说:
该类使用HostnameVerifier和SSLSocketFactory。 为这两个类定义了默认实现。 [ 1 ]
这是否意味着一旦打开连接
httpsCon = (HttpsURLConnection) url.openConnection();
它已经加密了SSL / TLS而没有任何麻烦吗?
如何查看和设置标准实现的TLS版本? (应该是Java 8的TLS 1.2和Java 7的TLS 1.0)
参考
- 甲骨文公司(2011年)。 javax.net.ssl.HttpsURLConnection 。 (JavaDoc的)
您必须创建一个SSLContext
来设置Protocoll:
在Java 1.8中 :
SSLContext sc = SSLContext.getInstance("TLSv1.2"); // Init the SSLContext with a TrustManager[] and SecureRandom() sc.init(null, trustCerts, new java.security.SecureRandom());
在Java 1.7中 :
SSLContext sc = SSLContext.getInstance("TLSv1"); // Init the SSLContext with a TrustManager[] and SecureRandom() sc.init(null, trustCerts, new java.security.SecureRandom());
那么你只需要将SSLContext设置为HttpsURLConnection :
httpsCon.setSSLSocketFactory(sc.getSocketFactory());
这应该够了吧。
您还可以使用JDK 1.7设置TLS 1.2协议。 默认情况下,JDK 1.7会将其设置为1.0。
SSLContext sc = SSLContext.getInstance("TLSv1.2"); //$NON-NLS-1$ sc.init(null, null, new java.security.SecureRandom()); HttpsURLConnection con = (HttpsURLConnection) httpsURL.openConnection(); con.setSSLSocketFactory(sc.getSocketFactory());
private static javax.net.ssl.SSLSocketFactory getFactorySimple() throws Exception { SSLContext context = SSLContext.getInstance("TLSv1.2");` context.init(null, null, null); return context.getSocketFactory(); } String loginurl ="some url"; HttpsURLConnection connection = null; URL url = new URL(loginURL); connection = (HttpsURLConnection) url.openConnection(); javax.net.ssl.SSLSocketFactory sslSocketFactory =getFactorySimple(); connection.setSSLSocketFactory(sslSocketFactory);
上面的代码可用于在java 1.7中启用tls 1.1或tls 1.2