android - Android中的OkHttp Mutual SSL

标签 android ssl okhttp android-security

我正在尝试使用 okhttp 在我的 android 应用程序上实现双向 ssl。目前,我已经通过输入流从原始文件夹中读取服务器证书并将其添加到 keystore ,将服务器证书添加到信任库,从而实现了证书固定。我不清楚的是如何添加客户端 key 对以使用相互 ssl 初始化 okhttp 客户端。我当前的代码是;

        try {

        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(null, null);
        InputStream certInputStream = context.getResources().openRawResource(
                context.getResources().getIdentifier("server",
                        "raw", context.getPackageName()));

        BufferedInputStream bis = new BufferedInputStream(certInputStream);
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        while (bis.available() > 0) {
            Certificate cert = certificateFactory.generateCertificate(bis);
            keyStore.setCertificateEntry("s1ha", cert);
        }
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keyStore);
        trustManagers = trustManagerFactory.getTrustManagers();
        sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustManagers, new SecureRandom());
    } catch (Exception e) {
        e.printStackTrace();
    }
我可以将带有客户端 key 对的 keystore 复制到原始文件夹并打开该 keystore 而不是默认类型并将其传递给信任管理器并构建 okhttp 客户端吗?
我是新手,对此我有点困惑。数周以来一直在寻找指南,但仍未找到明确解释该程序的指南。 Okhttp 自定义信任在这里找到 okhttp似乎很有希望,但我不确定它是否实现相互 SSL 任何帮助或示例代码将不胜感激。

最佳答案

如果您可以在应用程序中加载证书,那么您需要的代码大致是

    val keyPair: KeyPair = ...
    val certificate: X509Certificate = ...
    val intermediates: Array<X509Certificate> = ...

    val myClientCert = HeldCertificate(keyPair, certificate)
    
    val m = HandshakeCertificates.Builder()
      .addPlatformTrustedCertificates()
      .heldCertificate(myClientCert, *intermediates)
      .build()

    val client = OkHttpClient.Builder()
      .sslSocketFactory(m.sslSocketFactory(), m.trustManager)
      .build()
这会间接将其复制到临时 key 存储中,这就是为什么您需要访问私钥字节的原因,从而降低了整体安全性。

关于android - Android中的OkHttp Mutual SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65283321/

相关文章:

android - 如何从 rtsp 流中截取 Android 的 VideoView 的屏幕截图?

android - GSON : Parsing JSON key value with sometime Object & sometime Array

ssl - 如何验证我的 TLS 服务器是否正在加密流量?

tomcat - AWS ELB 和 Tomcat7 服务器的 HTTP 到 HTTPS 重定向

apache - 用于测试目的的 SSL 证书

java - Android 确保 HTTP 响应到达

android - 在自定义插件中修改AndroidManifest.xml

android - 无法解析符号 "OnClickListener"

Java OKHTTP SocketTimeoutException 与并发多线程请求

android - 由于某种原因,HttpLoggingInterceptor 没有记录 OkHttp 正文的响应