如果我尝试使用HttpURLConnection
和HttpsURLConnection
连接到“https”,会有什么不同?
我可以使用HttpURLConnection
和HttpsURLConnection
连接到“https”,所以我很困惑。如果我使用HttpsURLConnection?
以下是我的一些问题:
SSLSocketFactory
连接到“https”时没有HostnameVerifier
和HttpURLConnection
,我使用了SSLSocketFactory
和HostnameVerifier
?答案 0 :(得分:20)
我刚刚编写了一些代码作为测试(参见下面的所有方法)。最终发生的是 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();