美文网首页
OkHttpClient使用https协议

OkHttpClient使用https协议

作者: droid_zf | 来源:发表于2018-09-21 10:50 被阅读83次

    设置sslSocketFactory

    public static OkHttpClient getokhttpclient() {
            if (client == null) {
                OkHttpClient.Builder builder = new OkHttpClient.Builder();
                builder.sslSocketFactory(SSLSocketClient.getSSLSocketFactory());
                builder.hostnameVerifier(new TrustAllHostnameVerifier());
                client = builder.build();
            }
            return client;
        }
    

    1.自签名证书

    证书放在res/raw下
    使用p12证书

    public class SSLSocketClient {
        private static final String KEY_STORE_TYPE_BKS = "bks";//证书类型
        private static final String KEY_STORE_TYPE_P12 = "PKCS12";//证书类型
    
    //    public static native String getp12psw();
    
        private static final String KEY_STORE_PASSWORD = "123456";//证书密码(应该是客户端证书密码)
        private static final String KEY_STORE_TRUST_PASSWORD = "123456";//授信证书密码(应该是服务端证书密码)
    
        public static SSLSocketFactory getSSLSocketFactory(Context context) {
            InputStream trust_input = context.getResources().openRawResource(R.raw.trust);//服务器授信证书
            InputStream client_input = context.getResources().openRawResource(R.raw.client);//客户端证书
            try {
                SSLContext sslContext = SSLContext.getInstance("TLS");
                KeyStore trustStore = KeyStore.getInstance(KEY_STORE_TYPE_BKS);
                trustStore.load(trust_input, KEY_STORE_TRUST_PASSWORD.toCharArray());
    
                KeyStore keyStore = KeyStore.getInstance(KEY_STORE_TYPE_P12);
                keyStore.load(client_input, KEY_STORE_PASSWORD.toCharArray());
    
                TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
                trustManagerFactory.init(trustStore);
    
                KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
                keyManagerFactory.init(keyStore, KEY_STORE_PASSWORD.toCharArray());
    
                sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
                SSLSocketFactory factory = sslContext.getSocketFactory();
                return factory;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } finally {
                try {
                    trust_input.close();
                    client_input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    

    使用pem证书

    import android.content.Context;
    import java.io.IOException;
    import java.io.InputStream;
    import java.security.GeneralSecurityException;
    import java.security.KeyStore;
    import java.security.cert.Certificate;
    import java.security.cert.CertificateFactory;
    import java.util.Arrays;
    import java.util.Collection;
    import javax.net.ssl.KeyManagerFactory;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.TrustManagerFactory;
    import javax.net.ssl.X509TrustManager;
    import okhttp3.CertificatePinner;
    
    public final class PemSSL {
        public static final String tag = "CustomTrust";
        private static final String CLIENT_KET_PASSWORD = "214880157310437";
        static Context context;
    
        public static SSLSocketFactory getsslfactory(Context ct) {
            context = ct;
            X509TrustManager trustManager;
            SSLSocketFactory sslSocketFactory = null;
    
            try {
                //  trustManager = trustManagerForCertificates(trustedCertificatesInputStream());
                SSLContext sslContext = trustManagerForCertificates(trustedCertificatesInputStream()); //SSLContext.getInstance("TLS");
                sslSocketFactory = sslContext.getSocketFactory();
            } catch (GeneralSecurityException e) {
                throw new RuntimeException(e);
            } catch (IOException e) {
                e.printStackTrace();
            }
           return sslSocketFactory;
        }
    
        private static InputStream trustedCertificatesInputStream() {
            return context.getResources().openRawResource(R.raw.pem);
        }
    
        private static SSLContext trustManagerForCertificates(InputStream in)
                throws GeneralSecurityException, IOException {
            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
            Collection<? extends Certificate> certificates = certificateFactory.generateCertificates(in);
            if (certificates.isEmpty()) {
                throw new IllegalArgumentException("expected non-empty set of trusted certificates");
            }
    
            // Put the certificates a key store.
            char[] password = CLIENT_KET_PASSWORD.toCharArray(); // Any password will work.
            KeyStore keyStore = newEmptyKeyStore(password);
            int index = 0;
            for (Certificate certificate : certificates) {
                String certificateAlias = Integer.toString(index++);
                keyStore.setCertificateEntry(certificateAlias, certificate);
            }
    
            //  keyStore.load(in,CLIENT_KET_PASSWORD.toCharArray());
            // Use it to build an X509 trust manager.
            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(
                    KeyManagerFactory.getDefaultAlgorithm());
            keyManagerFactory.init(keyStore, password);
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
                    TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(keyStore);
            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
            if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
                throw new IllegalStateException("Unexpected default trust managers:"
                        + Arrays.toString(trustManagers));
            }
    
            SSLContext ssContext = SSLContext.getInstance("SSL");
            ssContext.init(keyManagerFactory.getKeyManagers(), trustManagers, null);
            //return (X509TrustManager) trustManagers[0];
            return ssContext;
        }
    
        private static KeyStore newEmptyKeyStore(char[] password) throws GeneralSecurityException {
            try {
                KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
                InputStream in = null; // By convention, 'null' creates an empty key store.
                keyStore.load(in, password);
                return keyStore;
            } catch (IOException e) {
                throw new AssertionError(e);
            }
        }
    }
    
    

    2.忽略验证

    public class SSLSocketClient {
        //获取这个SSLSocketFactory
        public static SSLSocketFactory getSSLSocketFactory() {
            try {
                SSLContext sslContext = SSLContext.getInstance("SSL");
                sslContext.init(null, getTrustManager(), new SecureRandom());
                return sslContext.getSocketFactory();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        //获取TrustManager
        private static TrustManager[] getTrustManager() {
            TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(X509Certificate[] chain, String authType) {
                        }
    
                        @Override
                        public void checkServerTrusted(X509Certificate[] chain, String authType) {
                        }
    
                        @Override
                        public X509Certificate[] getAcceptedIssuers() {
                            return new X509Certificate[]{};
                        }
                    }
            };
            return trustAllCerts;
        }
    }
    

    相关文章

      网友评论

          本文标题:OkHttpClient使用https协议

          本文链接:https://www.haomeiwen.com/subject/pelanftx.html