从服务器HTTPS - android接收和验证证书

Tvd*_*Tvd 8 ssl android web-services certificate

我通过https从我的Android客户端调用Web服务.我必须验证从服务器端接收的证书.我怎么做 ?目前这是我用来调用Web服务的代码.

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;   
}  
Run Code Online (Sandbox Code Playgroud)

如何在执行发布期间验证从服务器收到的自签名证书?我必须通过公钥/私钥进行测试.客户端将拥有一个CA文件.我需要客户端使用CA验证服务器证书,该服务是公共的.这与公钥/私钥有关.如何在致电帖子之前从服务器接收证书?

它们是stackoverflow上提供的几个选项和代码片段.我找到的多个链接的多个链接是: 在Android上接受HTTPs证书以及 使用Android和自签名服务器证书的HTTPS GET(SSL)

但我无法弄清楚哪些对我来说是好的/适用的!我不想禁用所有或接受任何.必须检查公钥/私钥/

任何帮助都非常感谢.

Jcs*_*Jcs 4

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

您只需创建一个KeyStore包含自签名证书并使用HttpClient该帖子中描述的自定义实现即可。


更新:

主机名验证可以通过X509HostnameVerifierSSLSocketFactory. Android 中已经提供了一些实现:AllowAllHostnameVerifier, BrowserCompatHostnameVerifier,StrictHostnameVerifier

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