我正在通过 https 从 Android 客户端调用 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;
}
如何验证在执行 Post 期间从服务器收到的自签名证书?我必须通过公钥/私钥进行测试。客户端将有一个 CA 文件。我只需要客户端使用CA验证服务器证书,该服务是公共的。这与公钥/私钥有关。在调用post之前如何从服务器接收证书?
stackoverflow 上提供了几个选项和代码片段。我发现有多个答案的几个链接是:在 Android 上接受 HTTPs 证书
使用 Android 和自签名服务器证书的 HTTPS GET (SSL)
但我无法弄清楚哪一个对我来说是好的/适用的!我不想禁用所有或接受任何。必须检查公钥/私钥/
非常感谢任何帮助。
Bob Lee 写了一篇关于如何在 Android 中使用 SSL 证书的精彩博客文章。我认为这适用于你的情况:http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html
你只需要创建一个KeyStore
包含您的自签名证书并使用自定义HttpClient
该帖子中描述的实施。
UPDATE:
主机名验证可以通过以下方式自定义设置自定义X509HostnameVerifier on the SSLSocketFactory
。 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());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)