Okhttp3.0 添加SSL证书

okhttp作为Android最主要的网络请求框架之一,估计从事Android开发的小伙伴没有不知道的;
okhttp一个简单请求:

Request request = new Request.Builder().get().url("https://www.baidu.com").build();

OkHttpClient.Builder builder = new OkHttpClient.Builder();

OkHttpClient client = builder.build();

 client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
            }

        });

上面这段代码大家都见过,没啥技术难度。
在开发中,为了网络安全会使用https,数字证书来保证网络安全,数字证书okhttp默认会提供的,但大型项目一般都会使用自己的证书,如何给okhttp添加证书呢?
直接上代码:


            CertificateFactory factory = CertificateFactory.getInstance("X.509");//设置证书类型,X.509是一种格式标准

            //证书类型
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());//KeyStore 是一个存储了证书的文件。文件包含证书的私钥,公钥和对应的数字证书的信息。
            keyStore.load(null, null);
            InputStream stream;
            Certificate certificate;//Certificate是证书信息封装的一个bean类

            if (cerPathList != null && !cerPathList.isEmpty()) {
                for (int i = 0; i < cerPathList.size(); i++) {
                    stream = context.getAssets().open(cerPathList.get(i));
                    certificate = factory.generateCertificate(stream);
                    //证书类型
                    keyStore.setCertificateEntry("alias" + i, certificate);//将每个证书封装类以键值对的方式存入KeyStore 
                }
            }

            TrustManagerFactory trustManagerFactory =       TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(keyStore);//通过keyStore得到信任管理器

            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            keyManagerFactory.init(keyStore, "pwd".toCharArray());//通过keyStore得到密匙管理器

            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();//拿到SSLSocketFactory

            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
            if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
                return null;
            }
            X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
            okHttpClient.sslSocketFactory(sslSocketFactory, trustManager)//设置ssl证书
            okHttpClient.build();

总结一下,

  1. 首先准备好 我们的证书,放在Assets目录下;
  2. 读取证书信息用封装成Certificate类,存入keyStore中;
  3. 获取信任管理器TrustManagerFactory, 秘钥管理器KeyManagerFactory,生成SSLContext;
  4. 通过SSLContext得到SSLSocketFactory, 通过okHttpClient.builder的sslSocketFactory添加到okhttp



转载于:https://www.jianshu.com/p/a4dd29195875

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在OkHttp3中信任所有证书,可以通过自定义信任管理器来实现。以下是一个示例代码: ```java // 创建信任管理器,以信任所有证书 TrustManager[] trustAllCerts = new TrustManager[] { new 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]; } } }; // 创建SSL上下文,并设置信任管理器 SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustAllCerts, new SecureRandom()); // 创建OkHttpClient实例,并配置信任所有证书SSL socket工厂 OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0]) .hostnameVerifier((hostname, session) -> true) .build(); // 使用client发送请求 Request request = new Request.Builder() .url("https://example.com") .build(); Response response = client.newCall(request).execute(); ``` 上述代码中,我们创建了一个自定义的信任管理器,其中的 `checkClientTrusted` 和 `checkServerTrusted` 方法为空实现,即不进行证书验证,`getAcceptedIssuers` 方法返回一个空的证书数组。然后,我们创建了一个SSL上下文,并使用自定义的信任管理器进行初始化。接下来,我们创建了一个OkHttpClient实例,并使用自定义的SSL socket工厂和主机验证器配置了该实例。最后,我们可以使用这个client实例发送请求。 请注意,信任所有证书可能会导致安全风险,请谨慎使用。在生产环境中,建议根据实际情况配置信任的证书
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值