2011-03-30 73 views
14

我在这里有代码,允许我连接到https服务器并传输数据。它工作得很好,但我想知道我是否以正确的方式进行,而且我确实正在建立安全连接。请检查我的工作。谢谢。Android/Java - 如何创建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

这是什么在上面的代码'socketFactory' – 2012-08-27 06:37:41

+0

通过使用此代码我收到'javax.net.ssl.SSLPeerUnverifiedException:没有同行certificate' – 2012-08-29 05:41:53

回答

7

看。

斯蒂芬ç提到的,你不需要注册端口80用于HTTPS环境。将它注册为http(如果需要的话)。这意味着,当您调用https url时,将使用正确的socketFactory。

注意:当您从Android设备连接到与不是很出名的发行人自定义证书或证书的网站,您会收到在大多数情况下,“证书不被信任”或类似的例外。如果是这种情况,您需要为您的应用程序创建自定义证书存储,以便它信任您的服务器证书。如果你想知道热点来实现这一点,你可以看看我的blog article

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

希望这有助于

+0

saxos嗨。我遵循了您的指示,并且仍然收到“不可信服务器证书”错误,随后出现“未找到CertPath的TrustAnchor”。错误依次为“java.security.cert.CertPathValidatorException:未找到CertPath的CertAnchor”。错误。我有一个有效的密钥库,它正在导入,但会发生这些错误。谢谢 – RyanM 2011-03-30 18:30:11

+0

嗨 您是否以正确的顺序导入所有必需的证书?首先是最内层的中间CA证书,最后是根CA.根本不要导入网络服务器证书。 注意:如果您的网络服务器以错误的顺序提供证书链(例如,第一个条目是根CA,第二个条目是中间CA),您仍然会收到“不可信”错误。 如果是这种情况,在Web服务器上更改顺序或看这里:http://stackoverflow.com/questions/4115101/apache-httpclient-on-android-producing-certpathvalidatorexception-issuername/4199518#4199518 – saxos 2011-03-31 15:41:41

+0

你好。我结束了使用一个urlconnection来做我的ssl通信。我的服务器使用的证书是众所周知的,因此我实际上并不需要这样做。 urlconnection为我处理它。谢谢。 – RyanM 2011-03-31 23:29:14

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?

这可能是无害/冗余,或者你要在官方Custom SSL context教程Apache的HttpClient的发送“https”开头的请求端口80