繁体   English   中英

使用 okHttp 进行证书固定

[英]Certificate pinning with okHttp

此问题可能与如何使用 Square OKHTTP 固定证书? 但因为不清楚,所以我再问一次。 我必须将 SSL 证书附加到我的 http 客户端。 我正在使用改造版本2.2.0和 okHttp 版本3.6.0

我有一个.crt格式的证书。 目前我正在做证书固定 ,如下所示 但我不知道它是否合适。 以下是我的代码

       static void pinCertificate(Context context, OkHttpClient.Builder builder) {
            try {
                CertificateFactory cf = CertificateFactory.getInstance("X.509");
                InputStream cert = context.getResources().openRawResource(R.raw.certificate);
                Certificate ca;
                ca = cf.generateCertificate(cert);

                // creating a KeyStore containing our trusted CAs
                String keyStoreType = KeyStore.getDefaultType();
                KeyStore keyStore = KeyStore.getInstance(keyStoreType);
                keyStore.load(null, null);
                keyStore.setCertificateEntry("ca", ca);


                String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
                TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
                tmf.init(keyStore);


                SSLContext sslContext = SSLContext.getInstance("TLS");
                sslContext.init(null, tmf.getTrustManagers(), null);
                builder.sslSocketFactory(sslContext.getSocketFactory());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

使用 okHttp 固定.crt证书是正确的方法吗? 我们如何测试它是否正确地进行了握手? 如果是错误的,任何人都可以显示示例代码以正确固定证书吗? 我看到了一些这样的样本和文档https://medium.com/@deelodroid/android-ssl-pinning-using-okhttp-ca1239065616

但这与我实施的完全不同。 他们在任何地方都没有使用过crt文件。

如果有人可以分享有关证书固定以及如何在 okHttp 中完成的更好解释,那将非常有帮助。 提前致谢!!

在此处查看示例https://square.github.io/okhttp/https/#certificate-pinning-kt-java

  private val client = OkHttpClient.Builder()
      .certificatePinner(
          CertificatePinner.Builder()
              .add("publicobject.com", "sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=")
              .build())
      .build()

提醒:未经服务器 TLS 管理员的许可,请勿使用证书锁定!

这是证书固定。 这是正确的方法。 您可以通过在手机中安装https证书,使用fiddlercharles对其进行测试。 如果请求不成功,则固定工作正常。 也可以通过禁用 ssl 固定来测试它。 在这种情况下,请求将成功,您将能够在 fiddler 或 charles 中看到请求 + 数据

您还可以使用公钥固定,这将在证书内固定公钥的 sha

我已经实现了以下方式

            InputStream cert = context.getResources().openRawResource(R.raw.certificate);            
            CertificateFactory cf=CertificateFactory.getInstance("X.509", "BC");
            InputStream caInput = new BufferedInputStream(cert);
            X509Certificate ca = (X509Certificate) cf.generateCertificate(caInput);
            caInput.close();
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(null);
            keyStore.setCertificateEntry(ca.getSubjectX500Principal().getName(), ca);
            KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
            kmf.init(keyStore, null);
            KeyManager[] keyManagers = kmf.getKeyManagers();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            tmf.init(keyStore);
            SSLContext context1 = SSLContext.getInstance("TLS");
            context1.init(keyManagers, tmf.getTrustManagers(), null);
            builder.sslSocketFactory(context1.getSocketFactory());

你正在做的方式是正确的方式。 我也以与您实施的方式相同的方式执行此操作。 和它一起去很好。 快乐编码:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM