使用HttpURLConnection和HttpsURLConnection连接到https?

Arc*_*rci 26 android httpurlconnection

如果我尝试使用HttpURLConnection和连接到"https"有什么区别HttpsURLConnection

我能够使用两者连接到"https" HttpURLConnection,HttpsURLConnection所以我很困惑.如果我使用的话,我想我只能建立与"https"的连接HttpsURLConnection?

以下是我的一些问题:

  • 如果我能够使用HttpURLConnection打开与"https"的连接,我的连接仍然是"https"还是变成"http"?
  • 如何验证证书?因为我没有任何SSLSocketFactoryHostnameVerifierHttpURLConnection同时连接的"https"开头,怎么SSLSocketFactoryHostnameVerifier我使用的?
  • 无论证书是否可信,这是否意味着我信任一切?

Jer*_*rds 21

  1. 正在使用HTTPS连接.
  2. 默认行为
  3. 不确定,但请阅读下文.

我刚刚编写了一些代码作为测试(参见下面的所有方法).最终发生的是URL.openConnection()调用将返回一个libcore.net.http.HttpsURLConnectionImpl类.

这是HttpsURLConnection的实现,但HttpsURLConnection继承自HttpURLConnection.所以你看到多态性在起作用.

进一步研究调试器,看来该类正在使用默认的工厂方法.

hostnameVerifier = javax.net.ssl.DefaultHostnameVerifier

sslSocketFactory = org.apache.harmony.xnet.provider.jsse.OpenSSLSocketFactoryImpl

基于此,看起来正在使用默认行为.我不知道这是否意味着你是否相信一切,但你肯定是在建立一个HTTPS连接.

文档有点提示连接将自动信任众所周知但不是自签名的CA. (见下文)我没有测试这个,但他们有关于如何在这里完成的示例代码.

如果应用程序想要信任不属于系统的证书颁发机构(CA)证书,则应通过HttpsURLConnection上设置的SSLSocketFactory指定自己的X509TrustManager.

Runnable r = new Runnable() {

    public void run() {
        try {
        URL test = new URL("https://www.google.com/");
        HttpURLConnection connection = (HttpURLConnection) test.openConnection();
        InputStream is = connection.getInputStream();
        StringWriter sw = new StringWriter();
        String value = new java.util.Scanner(is).useDelimiter("\\A").next();
        Log.w("GOOGLE", value);
        } catch(Exception e) {
            Log.e("Test", e.getMessage());
        }
    }

};

Thread t = new Thread(r);
t.start();
Run Code Online (Sandbox Code Playgroud)