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捕获流量。

希望这可以帮助