2011-04-18 62 views
8

我从我的android客户端通过https调用web服务。我必须验证从服务器端接收到的证书。我怎么做 ?目前这是我用来调用Web服务的代码。从服务器HTTPS接收并验证证书 - android

private static String SendPost(String url, ArrayList<NameValuePair> pairs) { // url = "https://....." 
    errorMessage = ""; 
    String response = ""; 

    DefaultHttpClient hc=new DefaultHttpClient();  
    ResponseHandler <String> res=new BasicResponseHandler();  
    HttpPost postMethod=new HttpPost(url); 

    try { 
postMethod.setEntity(new UrlEncodedFormEntity(pairs)); 
     response = hc.execute(postMethod, res); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }   

    return response; 
} 

如何验证在执行Post期间从服务器收到的自签名证书?我必须通过公钥/私钥进行测试。客户端将拥有一个CA文件。只需要客户端使用CA来验证服务器证书,服务就是公开的。这与公钥/私钥有关。在打电话之前,我怎样才能从服务器接收证书?

他们有几个选项和代码片段可用在stackoverflow上。我发现有多个答案的链接夫妇是: Accepting a certificate for HTTPs on Android HTTPS GET (SSL) with Android and self-signed server certificate

但我不能做出来,这是很好/适用于我!我不想禁用所有或接受任何。必须检查公/私钥/

任何帮助,高度赞赏。

回答

4

Bob Lee写了一篇关于如何在Android上使用SSL证书的博文。我认为这是适用于您的情况:http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

你只需要创建一个KeyStore包含您的自签名证书,并使用在该职位描述的定制HttpClient实施。


UPDATE:

主机名的验证可以通过setting a custom X509HostnameVerifierSSLSocketFactory customizez。一些实现已经可以在安卓AllowAllHostnameVerifierBrowserCompatHostnameVerifierStrictHostnameVerifier

/* ... */ 
public class MyHostnameVerifier extends AbstractVerifier { 
    boolean verify(String hostname, SSLSession session) { 
    X509Certificate[] chain = session.getPeerCertificateChain(); 
    /* made some checks... */ 
    return checked; 
    } 
} 
sslSocketFactory.setHostnameVerifier(new MyHostnameVerifier()); 
+1

我如何收到证书从服务器和测试数据的呢? – Tvd 2011-04-18 11:02:00

+0

你不需要做任何事情。证书由服务器在SSL握手期间发送,并由客户端应用程序根据KeyStore内容自动进行验证。握手在任何HTTP数据交换之前执行。如果你想执行更复杂的或自定义的证书验证,这也是可能的(但有一点需要解释,在这个评论中) – Jcs 2011-04-18 11:14:59

+0

@ Jcs,我已经有了我必须使用的certificate.cer文件。我不明白与Bouncy Castle的部分。另外我没有任何密码传递给trusted.load(); ????我坚持在这些点上。 – Tvd 2011-04-18 13:29:18