Retrofit2 配置Https 工具类

来源:互联网 发布:淘宝地址错了怎么改 编辑:程序博客网 时间:2024/06/05 19:50
public class HttpsUtils{    private static OkHttpClient.Builder mInstance;    public static OkHttpClient.Builder initOKHttp(OkHttpClient.Builder client){        if (mInstance == null)        {            synchronized (OkHttpClient.Builder.class)            {                if (mInstance == null)                {                    mInstance = client;                }            }        }        return mInstance;    }    public static OkHttpClient.Builder getInstance(){        if(mInstance == null){            mInstance = new OkHttpClient.Builder();        }        return mInstance;    }    public static class SSLParams    {        public SSLSocketFactory sSLSocketFactory;        public X509TrustManager trustManager;    }    public static SSLParams getSslSocketFactory(InputStream[] certificates, InputStream bksFile, String password)    {        SSLParams sslParams = new SSLParams();        try        {            TrustManager[] trustManagers = prepareTrustManager(certificates);            KeyManager[] keyManagers = prepareKeyManager(bksFile, password);            SSLContext sslContext = SSLContext.getInstance("TLS");            X509TrustManager trustManager = null;            if (trustManagers != null)            {                trustManager = new MyTrustManager(chooseTrustManager(trustManagers));            } else            {                trustManager = new UnSafeTrustManager();            }            sslContext.init(keyManagers, new TrustManager[]{trustManager},null);            sslParams.sSLSocketFactory = sslContext.getSocketFactory();            sslParams.trustManager = trustManager;            return sslParams;        } catch (NoSuchAlgorithmException e)        {            Log.i("retrofit", "getSslSocketFactory: "+e.getMessage());//            throw new AssertionError(e);        } catch (KeyManagementException e)        {            Log.i("retrofit", "getSslSocketFactory: "+e.getMessage());//            throw new AssertionError(e);        } catch (KeyStoreException e)        {            Log.i("retrofit", "getSslSocketFactory: "+e.getMessage());            e.printStackTrace();//            throw new AssertionError(e);        }        return sslParams;    }    private class UnSafeHostnameVerifier implements HostnameVerifier    {        @Override        public boolean verify(String hostname, SSLSession session)        {            return true;        }    }    private static class UnSafeTrustManager 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 java.security.cert.X509Certificate[]{};        }    }    private static TrustManager[] prepareTrustManager(InputStream... certificates)    {//空的说明采用默认信任管理器,支持Symantec,Go Daddy等机构,约150多个        if (certificates == null || certificates.length <= 0) return null;        try        {            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());            keyStore.load(null);            int index = 0;            for (InputStream certificate : certificates)            {                String certificateAlias = Integer.toString(index++);                keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));                try                {                    if (certificate != null)                        certificate.close();                } catch (IOException e)                {                    e.printStackTrace();                }            }            TrustManagerFactory trustManagerFactory = null;            trustManagerFactory = TrustManagerFactory.                    getInstance(TrustManagerFactory.getDefaultAlgorithm());            trustManagerFactory.init(keyStore);            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();            return trustManagers;        } catch (NoSuchAlgorithmException e)        {            e.printStackTrace();        } catch (CertificateException e)        {            e.printStackTrace();        } catch (KeyStoreException e)        {            e.printStackTrace();        } catch (Exception e)        {            e.printStackTrace();        }        return null;    }    private static KeyManager[] prepareKeyManager(InputStream bksFile, String password)    {        try        {            if (bksFile == null || password == null) return null;            KeyStore clientKeyStore = KeyStore.getInstance("BKS");            clientKeyStore.load(bksFile, password.toCharArray());            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());            keyManagerFactory.init(clientKeyStore, password.toCharArray());            return keyManagerFactory.getKeyManagers();        } catch (KeyStoreException e)        {            e.printStackTrace();        } catch (NoSuchAlgorithmException e)        {            e.printStackTrace();        } catch (UnrecoverableKeyException e)        {            e.printStackTrace();        } catch (CertificateException e)        {            e.printStackTrace();        } catch (IOException e)        {            e.printStackTrace();        } catch (Exception e)        {            e.printStackTrace();        }        return null;    }    private static X509TrustManager chooseTrustManager(TrustManager[] trustManagers)    {        for (TrustManager trustManager : trustManagers)        {            if (trustManager instanceof X509TrustManager)            {                return (X509TrustManager) trustManager;            }        }        return null;    }    private static class MyTrustManager implements X509TrustManager    {        private X509TrustManager defaultTrustManager;        private X509TrustManager localTrustManager;        public MyTrustManager(X509TrustManager localTrustManager) throws NoSuchAlgorithmException, KeyStoreException        {            TrustManagerFactory var4 = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());            var4.init((KeyStore) null);            defaultTrustManager = chooseTrustManager(var4.getTrustManagers());            this.localTrustManager = localTrustManager;        }        @Override        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException        {        }        @Override        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException        {            try            {                defaultTrustManager.checkServerTrusted(chain, authType);            } catch (CertificateException ce)            {                localTrustManager.checkServerTrusted(chain, authType);            }        }        @Override        public X509Certificate[] getAcceptedIssuers()        {            return new X509Certificate[0];        }    }}

在Application类里初始化即可

        //如果自定义签名,就不要传null,检测服务器,权威机构颁发,默认信任管理器即可        HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(new InputStream[]{new Buffer()   //your certificate                .writeUtf8("证书内的字符串复制过来即可")                .inputStream()}, null, "your password");        OkHttpClient.Builder client = new OkHttpClient.Builder();        client.connectTimeout(10, TimeUnit.SECONDS);        client.readTimeout(20, TimeUnit.SECONDS);        client.hostnameVerifier(new HostnameVerifier() {            @Override            public boolean verify(String hostname, SSLSession session) {                return true;            }        })                .sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager);        HttpsUtils.initOKHttp(client);


原创粉丝点击