美文网首页
android开发 实验给接口换成自己申请的https证书接口

android开发 实验给接口换成自己申请的https证书接口

作者: 吉凶以情迁 | 来源:发表于2024-05-28 18:19 被阅读0次

弄了之后,安卓那边没做什么操作,可以看到成功防止了,


image.png

勾选https进行抓包

image.png

如果不给手机装fildder证书的情况下
提示 certification path not found


image.png

可以看到默认换https自带防抓包了, 直接给报错,但是手机安装一个证书估计防不住了。
因此可能需要用到代码校验,但是在hook面前可能还要加其他混淆,自定义 api手段 封装加壳了。

代码校验自己的证书



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;

    }


多个证书

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;

}

信任所有证书 没意义你还是改http好了

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);

    }

}

相关文章

网友评论

      本文标题:android开发 实验给接口换成自己申请的https证书接口

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