我这里有代码,允许我连接到https服务器并传输数据。它工作得很好,但我想知道我是否正确地做到这一点,而我实际上正在建立一个安全的连接。请检查我的工作。感谢。
public class HTTPSClient extends DefaultHttpClient
{
public HTTPSClient()
{
}
@Override
protected ClientConnectionManager createClientConnectionManager()
{
SchemeRegistry registry = new SchemeRegistry();
HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER;
final SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
//socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", socketFactory, 80));
registry.register(new Scheme("https", socketFactory, 443));
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
return new SingleClientConnManager(params, registry);
}
}
我像这样使用这段代码:
HttpResponse response = mConnection.httpsClient.execute(new HttpHost("www.somehostname.com", 80), new HttpGet("https://someaddress")));
然后我读了那里的回复。
再次感谢。
答案 0 :(得分:7)
查看Apache HttpClient的官方Custom SSL context教程。
正如Stephen C所提到的,您不需要为https上下文注册端口80。将其注册为http(如果需要的话)。这意味着,当您调用https url时,将使用您指定的相应socketFactory。
注意:当您从Android设备连接到具有自定义证书或来自不是众所周知的发卡机构的证书的网站时,您将在大多数情况下收到“不受信任的证书”或类似的例外情况。如果是这种情况,则需要为应用程序创建自定义证书存储区,以便它信任您的服务器证书。如果您想知道热点,可以查看我的blog article
如果您想检查,如果您的设备确实通过安全连接进行通信,您可以从Android模拟器调用https端点,并在开发人员计算机上使用Wireshark捕获流量。
希望这有帮助
答案 1 :(得分:4)
我对此表示怀疑:
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", socketFactory, 80));
registry.register(new Scheme("https", socketFactory, 443));
特别是第2行。为什么要为“https”方案注册端口80?
这是无害/冗余,或者您要向端口80发送“https”请求。