我通过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;
}
如何在执行发布期间验证从服务器收到的自签名证书?我必须通过公钥/私钥进行测试。客户端将拥有一个CA文件。我需要客户端使用CA验证服务器证书,该服务是公共的。这与公钥/私钥有关。如何在致电帖子之前从服务器接收证书?
他们有几个选项和stackoverflow上可用的代码片段。我找到多个链接的链接是: Accepting a certificate for HTTPs on Android HTTPS GET (SSL) with Android and self-signed server certificate
但是我无法弄清楚哪些对我来说是好的/适用的!我不想禁用所有或接受任何。必须检查公钥/私钥/
非常感谢任何帮助。
答案 0 :(得分:4)
Bob Lee写了一篇关于如何在Android上使用SSL证书的好文章。我认为它适用于您的情况:http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html
您只需创建一个包含自签名证书的KeyStore
,并使用该帖子中描述的自定义HttpClient
实现。
<强>更新强>
SSLSocketFactory
上的setting a custom X509HostnameVerifier
可以自定义主机名验证。某些实现已在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());