关于ssl:Java HttpsURLConnection和TLS 1.2

Java HttpsURLConnection and TLS 1.2

我读过一篇文章,其中HttpsURLConnection将透明地协商SSL连接。

官方文件说:

This class uses HostnameVerifier and SSLSocketFactory. There are default implementations defined for both classes. [1]

这是否意味着一旦您与

1
httpsCon = (HttpsURLConnection) url.openConnection();

它已经被SSL / TLS加密了,没有更多麻烦了吗?

如何查看和设置标准实施的TLS版本?
(对于Java 8应该是TLS 1.2,对于Java 7应该是TLS 1.0)

参考文献

  • 甲骨文公司(2011)。 javax.net.ssl.HttpsURLConnection。 (JavaDoc)
    • 请不要引用任意互联网垃圾。 除非您使用未指定的特定JRE,否则您引用的页面的正确URL在Oracle网站上。
    • 我添加了官方文档,而不是更改后的文档-非官方文档指出SSL是透明替换的,官方文档指出存在默认实现。 所以我的问题还是一样,希望我的帖子现在更加透明。
    • 您可以通过https.protocols系统属性设置要使用的TLS版本,请参见此答案。
    • 我在Java 1.6中尝试这种方式:stackoverflow.com/questions/33517476/
    • 什么是默认连接模式SSL,TLS1.0或TLS1.2?
    • 取决于JDK 1.7中的Java版本,它将设置为TLS 1.0


    您将必须创建一个SSLContext来设置Protocoll:
    在Java 1.8中:

    1
    2
    3
     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中:

    1
    2
    3
     SSLContext sc = SSLContext.getInstance("TLSv1");
     // Init the SSLContext with a TrustManager[] and SecureRandom()
     sc.init(null, trustCerts, new java.security.SecureRandom());

    那么您只需将SSLContext设置为HttpsURLConnection:

    1
    httpsCon.setSSLSocketFactory(sc.getSocketFactory());

    这应该够了吧。

    • 什么是trustCerts,您如何创建/获得一个?
    • 如果有人想知道init()参数,以下是文档说明:"前两个参数中的任何一个都可以为null,在这种情况下,将搜索已安装的安全提供程序以寻找适当工厂的最高优先级实现。同样, 安全随机参数可以为null,在这种情况下,将使用默认实现。"
    • 请参阅stackoverflow.com/questions/1201048/以获取琐碎,不安全,完全信任的trustCerts实现


    您还可以使用JDK 1.7设置TLS 1.2协议。 默认情况下,JDK 1.7会将其设置为1.0。

    1
    2
    3
    4
    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());

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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

    • 是的,它可能可以...但是它有什么作用?
    • 这有助于在Java 7中设置tls 1.2,而在Java 7中默认情况下未启用此功能
    • 默认情况下,SSL,TLS1.0或TLS1.2使用什么?