android https 绕证书

       之前很长一段时间开发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;
    }


}
   

猜你喜欢

转载自blog.csdn.net/mrpanda87/article/details/73740820