android https 绕证书

来源:互联网 发布:软件数据接口 编辑:程序博客网 时间:2024/05/18 00:11

       之前很长一段时间开发android开发 网络通信都是用的http,后来到了现在的公司,网络通信是https,理论上https比http更加安全,但是公司是自建证书(后来问了一些朋友有的公司为了降低成本都没有买,都是自建证书),所以通信的过程需要绕开证书(也可以叫做信任证书),http和https在通信过程中是有一点不一样的,废话不多说直接上源码 我通信这一块用到的是RxAndroid+RxJava+OkHttp3,目前比较主流的网络请求框架。

    

import android.util.Log;import java.security.SecureRandom;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import java.util.concurrent.TimeUnit;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSession;import javax.net.ssl.SSLSocketFactory;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import okhttp3.MediaType;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;import rx.Observable;import rx.Subscriber;/** * Created by mrpanda on 4/5/17. */public class HTTPSRequestUtils {    private static OkHttpClient okHttpClient;    public static final MediaType JSON            = MediaType.parse("application/json; charset=utf-8");    public static Observable<String> getJson(final String path, final String json){        return Observable.create(new Observable.OnSubscribe<String>(){            @Override            public void call(Subscriber<? super String> subscriber) {                if(!subscriber.isUnsubscribed()){                    okHttpClient = new OkHttpClient.Builder()                            .sslSocketFactory(createSSLSocketFactory())                            .hostnameVerifier(new TrustAllHostnameVerifier())                            .connectTimeout(60, TimeUnit.SECONDS)                            .writeTimeout(100, TimeUnit.SECONDS)                            .readTimeout(60, TimeUnit.SECONDS)                            .build();                    RequestBody requestBody= RequestBody.create(JSON,json);                    Request request=new Request.Builder()                                    .url(path)                                    .post(requestBody)                                    .build();                    try{                       Response response= okHttpClient.newCall(request).execute();                        Log.e("response",response.toString());                        if(response.isSuccessful()){                            subscriber.onNext(response.body().string());                        }else{                            subscriber.onNext("获取失败!");                        }                        subscriber.onCompleted();                    }catch (Exception e){                         e.printStackTrace();                    }                }            }        });    }    private static class TrustAllCerts implements X509TrustManager {        @Override        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}        @Override        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}        @Override        public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}    }    private static class TrustAllHostnameVerifier implements HostnameVerifier {        @Override        public boolean verify(String hostname, SSLSession session) {            return true;        }    }    private static SSLSocketFactory createSSLSocketFactory() {        SSLSocketFactory ssfFactory = null;        try {            SSLContext sc = SSLContext.getInstance("TLS");            sc.init(null,  new TrustManager[] { new TrustAllCerts() }, new SecureRandom());            ssfFactory = sc.getSocketFactory();        } catch (Exception e) {        }        return ssfFactory;    }}