使用HttpURLConnection和HttpsURLConnection连接到https?

如果我尝试使用HttpURLConnectionHttpsURLConnection连接到“https”有什么区别?

我能够使用HttpURLConnectionHttpsURLConnection连接到“https”,所以我很困惑。 如果我使用HttpsURLConnection?我以为我只能建立与“https”的连接HttpsURLConnection?

以下是我的一些问题:

  • 如果我能够使用HttpURLConnection打开与“https”的连接,我的连接仍然是“https”还是变成“http”?
  • 如何validation证书? 由于在连接到“https”时我的HttpURLConnection上没有任何SSLSocketFactoryHostnameVerifier ,我使用的SSLSocketFactoryHostnameVerifier是什么?
  • 无论证书是否可信,这是否意味着我信任一切?

Solutions Collecting From Web of "使用HttpURLConnection和HttpsURLConnection连接到https?"

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

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

这是HttpsURLConnection的实现,但HttpsURLConnectioninheritance自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();