android httpClient 支持HTTPS的处理方式

来源:互联网 发布:mysql explain type 编辑:程序博客网 时间:2024/06/05 11:39

问题:
项目中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

0 0
原创粉丝点击