美文网首页
2023-05-24 Okttp 添加证书认证

2023-05-24 Okttp 添加证书认证

作者: 谢勤忠045 | 来源:发表于2023-05-23 15:47 被阅读0次

单个证书添加

1.首先,需要将证书文件(.crt 格式)放置在 Android 项目的 asset 目录下。

image

接下来,在 OkHttpClient.Builder() 中,使用setSslSocketFactory()方法来为 SSL 连接设置证书:


OkHttpClient client = new OkHttpClient.Builder()

                .sslSocketFactory(getSslSocketFactory(context))

                .build();

还需要实现 getSslSocketFactory:


private SSLSocketFactory getSslSocketFactory(Context context) {

        try {

            CertificateFactory cf = CertificateFactory.getInstance("X.509");

            InputStream caInput = context.getAssets().open("your_certificate_file.crt");

            Certificate ca;

            try {

                ca = cf.generateCertificate(caInput);

            } finally {

                caInput.close();

            }

            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

            keyStore.load(null, null);

            keyStore.setCertificateEntry("ca", ca);

            TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

            tmf.init(keyStore);

            SSLContext sslContext = SSLContext.getInstance("TLS");

            sslContext.init(null, tmf.getTrustManagers(), null);

            return sslContext.getSocketFactory();

        } catch (Exception e) {

            e.printStackTrace();

        }

        return null;

    }

如果需要信任多个证书,可以使用 getTrustManagers() 方法添加多个证书。


private SSLSocketFactory getSSLSocketFactory(Context context) {

    try {

        CertificateFactory cf = CertificateFactory.getInstance("X.509");

        List<Certificate> certificates = new ArrayList<>();

        certificates.add(cf.generateCertificate(context.getAssets().open("your_certificate_file_1.crt")));

        certificates.add(cf.generateCertificate(context.getAssets().open("your_certificate_file_2.crt")));

        // Create a KeyStore containing the trusted root certificates

        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

        keyStore.load(null, null);

        for (int i = 0; i < certificates.size(); i++) {

            Certificate certificate = certificates.get(i);

            String certificateAlias = Integer.toString(i);

            keyStore.setCertificateEntry(certificateAlias, certificate);

        }

        // Create a TrustManager that trusts the CAs in our KeyStore

        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

        tmf.init(keyStore);

        // Create an SSLContext that uses our TrustManager

        SSLContext sslContext = SSLContext.getInstance("TLS");

        sslContext.init(null, tmf.getTrustManagers(), null);

        return sslContext.getSocketFactory();

    } catch (Exception e) {

        e.printStackTrace();

    }

    return null;

}

还可以使用信任所有证书的模式(忽略SSL证书模式)


private static OkHttpClient getUnsafeOkHttpClient() {

    try {

        // 创建不验证证书链的TrustManager

        final TrustManager[] trustAllCerts = new TrustManager[] {

            new X509TrustManager() {

                @Override

                public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}

                @Override

                public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}

                @Override

                public java.security.cert.X509Certificate[] getAcceptedIssuers() {

                    return new java.security.cert.X509Certificate[] {};

                }

            }

        };

        // 使用不验证证书链的TrustManager初始化SSLContext

        final SSLContext sslContext = SSLContext.getInstance("SSL");

        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

        // 创建只使用通过SSLContext初始化的TrustManager的SSL套接字工厂

        final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

        // 创建可以忽略证书链的OkHttpClient

        OkHttpClient.Builder builder = new OkHttpClient.Builder()

                .sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0])

                .hostnameVerifier((hostname, session) -> true);

        return builder.build();

    } catch (Exception e) {

        throw new RuntimeException(e);

    }

}

但是忽略证书可能会导致安全问题,如果有正式证书最好不要用这个,但是也确实好用

相关文章

  • iOS通过AFNetworking实现HTTPS双向认证

    1. 添加认证证书 2. 校验证书

  • okhttp3证书解决方式

    使用okttp3访问https时不配置证书或者忽略证书会报错: 可以采用两种方式:第一种:根据自己的证书服务器来配...

  • 网络

    认证 ssl/tls 1.客户端证书认证 (TLS双向认证) CA #证书认证2.bearerToken3.Se...

  • 认证证书和认证标志管理办法

    认证证书和认证标志管理办法第一章总则第一条 为加强对产品、服务、管理体系认证的认证证书和认证标志(以下简称认证证书...

  • 第一次数据库笔记

    认证方面: 目前认可度比较高的认证基本都是oracle的,包括OCA证书、OCP证书、OCM证书,级别由低到高,难...

  • 认证

    基本权限认证分为OAuth认证,摘要认证和基本认证,证书认证,表单认证 OAuth 认证流程详解: 摘抄自:htt...

  • 终极武器——数字证书

    数字证书也称电子证书,由数字证书颁发认证机构(CA)签发才具备可认证性。数字证书采用了公钥基础设施(PKI),使用...

  • CCC证书注销和暂停管理规定

    认证证书注销 1、认证证书有效期满、未申请延期使用。 2、工厂倒闭、产品不再生产、认证委托人主动放弃效率保持认证证...

  • Universal Links设置详细步骤

    1.登录苹果开发者账号添加和配置证书: 1.1没有证书的添加证书: 关于添加Certificates, Ident...

  • 证书认证

    TKAFHTTPSessionManager manager = [TKAFHTTPSessionManager ...

网友评论

      本文标题:2023-05-24 Okttp 添加证书认证

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