Android进阶(二)https请求No peer certificate的解决方法.
在做Android客户端通过https协议访问12306,并爬取数据时,出现了如下错误:
其中有一条错误提示是javax.net.ssl.SSLPeerUnverifiedException:Nopeercertificate的异常。现给出解决方法。
写了一个自定义类继承SSLSocketFactory:
importjava.io.IOException;
importjava.net.Socket;
importjava.net.UnknownHostException;
importjava.security.KeyManagementException;
importjava.security.KeyStore;
importjava.security.KeyStoreException;
importjava.security.NoSuchAlgorithmException;
importjava.security.UnrecoverableKeyException;
importjavax.net.ssl.SSLContext;
importjavax.net.ssl.TrustManager;
importjavax.net.ssl.X509TrustManager;
importorg.apache.http.conn.ssl.SSLSocketFactory;
publicclassSSLSocketFactoryExextendsSSLSocketFactory{
SSLContextsslContext=SSLContext.getInstance("TLS");
publicSSLSocketFactoryEx(KeyStoretruststore)
throwsNoSuchAlgorithmException,KeyManagementException,
KeyStoreException,UnrecoverableKeyException{
super(truststore);
TrustManagertm=newX509TrustManager(){
publicjava.security.cert.X509Certificate[]getAcceptedIssuers(){returnnull;}
@Override
publicvoidcheckClientTrusted(
java.security.cert.X509Certificate[]chain,StringauthType)
throwsjava.security.cert.CertificateException{}
@Override
publicvoidcheckServerTrusted(
java.security.cert.X509Certificate[]chain,StringauthType)
throwsjava.security.cert.CertificateException{}
};
sslContext.init(null,newTrustManager[]{tm},null);
}
@Override
publicSocketcreateSocket(Socketsocket,Stringhost,intport,booleanautoClose)throwsIOException,UnknownHostException{
returnsslContext.getSocketFactory().createSocket(socket,host,port,autoClose);
}
@Override
publicSocketcreateSocket()throwsIOException{
returnsslContext.getSocketFactory().createSocket();
}
}
再来看看如何做回调:
publicstaticHttpClientgetNewHttpClient(){
try{
KeyStoretrustStore=KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null,null);
SSLSocketFactorysf=newSSLSocketFactoryEx(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParamsparams=newBasicHttpParams();
HttpProtocolParams.setVersion(params,HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params,HTTP.UTF_8);
SchemeRegistryregistry=newSchemeRegistry();
registry.register(newScheme("http",PlainSocketFactory.getSocketFactory(),80));
registry.register(newScheme("https",sf,443));
ClientConnectionManagerccm=newThreadSafeClientConnManager(params,registry);
returnnewDefaultHttpClient(ccm,params);
}catch(Exceptione){
returnnewDefaultHttpClient();
}
}
现在就可以拿这个HTTPClient去请求数据了。
更多相关文章
- 一句话锁定MySQL数据占用元凶
- Android客户端与服务器之间传递json数据
- Android实现简单的电子词典
- Android简单实现Socket通信,客户端连接服务器后,服务器向客户端发
- Android(安卓)Studio关于USB device not found的解决办法
- android简单实例---------SharedPreferences的简单使用与讲解
- android SQLiteDatabase
- Android简单实现BroadCastReceiver广播机制
- Android(安卓)的第三方报表组件,AChartEngine 案列demo