【问题标题】:Android/Java -- How to Create HTTPS Connection?Android/Java -- 如何创建 HTTPS 连接?
【发布时间】:2011-03-30 11:00:13
【问题描述】:

我这里有代码,可以让我连接到 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")));

然后我从那里读取响应。 再次感谢。

【问题讨论】:

  • 上面的代码socketFactory是什么意思
  • 通过使用此代码我得到javax.net.ssl.SSLPeerUnverifiedException: No peer certificate

标签: java android ssl https


【解决方案1】:

查看来自 Apache HttpClient 的官方 Custom SSL context 教程。

正如 Stephen C 所提到的,您不需要为 https 上下文注册端口 80。将其注册为 http(如果有必要的话)。这意味着,当您调用 https url 时,将使用您指定的相应 socketFactory。

注意:在大多数情况下,当您从 Android 设备连接到具有自定义证书或来自不太知名的颁发者的证书的网站时,您会收到“证书不受信任”或类似异常。如果是这种情况,您需要为您的应用程序创建一个自定义证书存储,以便它信任您的服务器证书。想知道hot实现这个,可以看我的blog article

如果您想检查您的设备是否真的通过安全连接进行通信,您可以从您的 android 模拟器调用 https 端点,并在您的开发人员机器上使用 Wireshark 捕获流量。

希望对你有帮助

【讨论】:

  • 嗨,萨克斯。我按照您的说明进行操作,但仍然收到“不信任的服务器证书”错误,然后是“未找到 CertPath 的 TrustAnchor”。错误后跟“java.security.cert.CertPathValidatorException:未找到 CertPath 的 TrustAnchor。”错误。我有一个有效的密钥库,它正在导入,但是会发生这些错误。谢谢
  • 嗨,您是否以正确的顺序导入了所有必需的证书?首先是最里面的中间 CA 证书,最后是根 CA。根本不要导入网络服务器证书。注意:如果您的网络服务器以错误的顺序提供证书链(例如,第一个条目是根 CA,第二个条目是中间 CA),您仍然会收到“不信任”错误。如果是这种情况,请更改网络服务器上的顺序或查看此处:stackoverflow.com/questions/4115101/…
  • 嗨。我最终只是使用 urlconnection 进行 ssl 通信。我的服务器使用的证书是众所周知的,因此我实际上不需要做任何这些。 urlconnection 为我处理它。谢谢。
【解决方案2】:

我对此表示怀疑:

    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    registry.register(new Scheme("https", socketFactory, 80));
    registry.register(new Scheme("https", socketFactory, 443));

尤其是第二行。为什么要为“https”方案注册端口 80?

这要么是无害的/多余的,要么你要向端口 80 发送“https”请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多