使用HttpURLConnection和HttpsURLConnection连接到https?

时间:2012-04-01 00:47:36

标签: android httpurlconnection

如果我尝试使用HttpURLConnectionHttpsURLConnection连接到“https”,会有什么不同?

我可以使用HttpURLConnectionHttpsURLConnection连接到“https”,所以我很困惑。如果我使用HttpsURLConnection?

,我认为我只能建立与“https”的连接

以下是我的一些问题:

  • 如果我能够使用HttpURLConnection打开与“https”的连接,我的连接是否仍处于“https”状态,还是变为“http”?
  • 证书的验证怎么样?由于我在SSLSocketFactory连接到“https”时没有HostnameVerifierHttpURLConnection,我使用了SSLSocketFactoryHostnameVerifier
  • 这是否意味着无论证书是否可信,我都信任一切?

1 个答案:

答案 0 :(得分:20)

  1. 正在使用HTTPS连接。
  2. 默认行为
  3. 不确定,但请阅读以下内容。
  4. 我刚刚编写了一些代码作为测试(参见下面的所有方法)。最终发生的是 URL.openConnection()调用将返回 libcore.net.http.HttpsURLConnectionImpl 类。

    这是HttpsURLConnection的实现,但HttpsURLConnection继承自HttpURLConnection。所以你看到多态性正在发挥作用。

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

    hostnameVerifier = javax.net.ssl.DefaultHostnameVerifier

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

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

    文档提示连接将自动信任众所周知但不是自签名的CA. (见下文)我没有对此进行测试,但他们在how to accomplish that here上有示例代码。

      

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

    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();
    
相关问题