问题:android连接部分https网站时会发生连接错误,报错信息类似: Not trusted server certificate
经过测试android4.1之后版本的都有类似问题
解决方法:
在自己封装的http类中添加以下代码,同时在http连接时使用HttpURLConnection connection = (HttpURLConnection) url.openConnection();即可解决问题
// always verify the host - do not check for certificate
final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier(){@Override
public boolean verify(String hostname, SSLSession session) {
DebugLog.logd("Approving certificate for " + hostname);
return true;
}
};
/**
* Trust every server - dont check for any certificate
*/
private static void trustAllHosts()
{
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager(){
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] chain,
String authType)
throws java.security.cert.CertificateException {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] chain,
String authType)
throws java.security.cert.CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[] {};
}
}
};
//Install the all-trusting trust manager
try
{
HttpsURLConnection.setDefaultHostnameVerifier(DO_NOT_VERIFY);
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
catch (Exception e)
{
e.printStackTrace();
}
}
static{
DebugLog.logd("trustAllHosts");
trustAllHosts();
}
参考:http://stackoverflow.com/questions/2012497/accepting-a-certificate-for-https-on-android