Java HttpsURLConnection在没有setSSLSocketFactory设置的情况下成功执行

时间:2016-03-07 21:15:17

标签: java https java-8 ssl-certificate httpsurlconnection

我正在测试 javax.net.ssl.HttpsURLConnection 。因为该程序正在发出HTTPS请求所以我认为我必须执行 setSSLSocketFactory 才能使请求正常工作。

但程序运行正常,没有setSSLSocketFactory设置:

这是我的代码:

public class HttpsTest {

    public static void main(String[] args) {

        try {

            URL requestUrl = new URL("https://www.google.com/?gws_rd=ssl");
            HttpsURLConnection conn = (HttpsURLConnection) requestUrl.openConnection();

            // conn.setSSLSocketFactory(sslSocketFactory);

            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }

            System.out.println("getResponseCode: " + conn.getResponseCode());

            br.close();
            conn.disconnect();

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        // RESULT:

        // Some HTML return by https://www.google.com/?gws_rd=ssl
        // getResponseCode: 200 OK
    }
}

我对Https有什么误解?为什么程序在没有sslSocketFactory设置的情况下工作? (HttpsURLConnection需要sslSocketFactory来验证服务器发送的SSL / TLS公共证书)

谢谢!

2 个答案:

答案 0 :(得分:1)

  

我认为我必须setSSLSocketFactory()才能使请求工作

你没有。它有一个默认值。

答案 1 :(得分:1)

默认行为是使用Java安装附带的证书颁发机构。一切都是开箱即用的事实意味着远程主机使用由证书颁发机构签名的证书(不是自签名的)。

如果要使用备用CA或允许自签名证书被Java信任为有效证书,则只需覆盖此默认行为。