android httpClient 支持HTTPS的处理方式
16lz
2021-01-24
问题:
项目中Android https或http请求地址重定向为HTTPS的地址,相信很多人都遇到了这个异常(无终端认证): javax.NET.ssl.SSLPeerUnverifiedException: No peer certificate
解决过程:
1.没遇到过的问题,搜索吧,少年
log里出现这个异常,作者第一次遇到,不知道啥意思。看下字面意思,是ssl协议中没有终端认证。SSL?作者没用到ssl协议呀,只是通过httpClient请求一个重定向https的地址。
好吧,google下,知道了个差不多情况的帖子,http://www.eoeandroid.com/thread-161747-1-1.html。恩恩,一个不错的帖子,给出了个解决方案。照着来试下。添加个继承SSLSocketFactory的
自定义类。并在初始化httpclient支持https时,注册进去。看下面代码:
public class HttpClientHelper {0203 private static HttpClient httpClient;0405 private HttpClientHelper() {06 }0708 public static synchronized HttpClient getHttpClient() {0910 if (null == httpClient) {11 // 初始化工作12 try {13 KeyStore trustStore = KeyStore.getInstance(KeyStore14 .getDefaultType());15 trustStore.load(null, null);16 SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore);17 sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); //允许所有主机的验证1819 HttpParams params = new BasicHttpParams();2021 HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);22 HttpProtocolParams.setContentCharset(params,23 HTTP.DEFAULT_CONTENT_CHARSET);24 HttpProtocolParams.setUseExpectContinue(params, true);2526 // 设置连接管理器的超时27 ConnManagerParams.setTimeout(params, 10000);28 // 设置连接超时29 HttpConnectionParams.setConnectionTimeout(params, 10000);30 // 设置socket超时31 HttpConnectionParams.setSoTimeout(params, 10000);3233 // 设置http https支持34 SchemeRegistry schReg = new SchemeRegistry();35 schReg.register(new Scheme("http", PlainSocketFactory36 .getSocketFactory(), 80));37 schReg.register(new Scheme("https", sf, 443));3839 ClientConnectionManager conManager = new ThreadSafeClientConnManager(40 params, schReg);4142 httpClient = new DefaultHttpClient(conManager, params);43 } catch (Exception e) {44 e.printStackTrace();45 return new DefaultHttpClient();46 }47 }48 return httpClient;49 }5051}5253class SSLSocketFactoryEx extends SSLSocketFactory {5455 SSLContext sslContext = SSLContext.getInstance("TLS");5657 public SSLSocketFactoryEx(KeyStore truststore)58 throws NoSuchAlgorithmException, KeyManagementException,59 KeyStoreException, UnrecoverableKeyException {60 super(truststore);6162 TrustManager tm = new X509TrustManager() {6364 @Override65 public java.security.cert.X509Certificate[] getAcceptedIssuers() {66 return null;67 }6869 @Override70 public void checkClientTrusted(71 java.security.cert.X509Certificate[] chain, String authType)72 throws java.security.cert.CertificateException {7374 }7576 @Override77 public void checkServerTrusted(78 java.security.cert.X509Certificate[] chain, String authType)79 throws java.security.cert.CertificateException {8081 }82 };8384 sslContext.init(null, new TrustManager[] { tm }, null);85 }8687 @Override88 public Socket createSocket(Socket socket, String host, int port,89 boolean autoClose) throws IOException, UnknownHostException {90 return sslContext.getSocketFactory().createSocket(socket, host, port,91 autoClose);92 }9394 @Override95 public Socket createSocket() throws IOException {96 return sslContext.getSocketFactory().createSocket();97 }98}
http://blog.csdn.net/lihenair/article/details/17441169
更多相关文章
- Android基础开源应用项目
- Android(安卓)Android(安卓)Studio 3.3 项目中导入环信的 EaseUI
- android 新浪微博sdk使用-分享
- Android面试系列文章2018之Java部分类加载器篇
- Android防止崩溃的库,有效的降低Crash率
- Android高手进阶教程(十)之----Android(安卓)PopupWindow的使用!
- android 设备唯一码的获取,Cpu号,Mac地址
- DDPush开源推送框架源码分析之APPServer到DDPush
- Android(安卓)sdk安装目录中没有platform-tools目录问题详解