Android / Java —如何创建HTTPS连接?
问题内容:
我这里有代码,可让我连接到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")));
然后,我从那里阅读响应。再次感谢。
问题答案:
查看Apache HttpClient 的官方Custom SSL上下文教程。
正如Stephen C所提到的,您不需要为https上下文注册端口80。将其注册为http(如果需要)。这意味着,当您调用https
url时,将使用您指定的适当的socketFactory。
注意:在大多数情况下,当您使用自定义证书或不太知名的发行者的证书从Android设备连接到站点时,您将收到“证书不受信任”或类似的例外情况。在这种情况下,您需要为您的应用程序创建一个自定义证书存储,以便它将信任您的服务器证书。如果您想知道实现此目标的热力,可以看一下我的博客文章
如果要检查,如果您的设备确实通过安全连接进行通信,则可以从Android模拟器调用https端点,并使用开发人员计算机上的Wireshark捕获流量。
希望这可以帮助