android - 如何强制 Android 11 上的 OkHttp 使用 TLS 1.3 发送 ssl 客户端证书身份验证

标签 android authentication ssl okhttp

我们需要对只接受 TLS 1.3 连接的服务器执行基于证书的客户端身份验证。
服务器使用 Apache 2 和 HTTP 1.1,并配置为允许客户端证书身份验证但不强制执行,因为某些资源需要客户端身份验证,而其他资源则不需要。
我们在 Android 11 上使用 OkHttp 4.9.1 来执行调用,并且我们遵循关于如何执行客户端身份验证的标准文档:https://github.com/square/okhttp/tree/master/okhttp-tls
然而,服务器回复:403(不允许重新协商身份验证)
这符合 TLS 1.3 规范,该规范不允许身份验证重新协商,除非在初始握手期间达成一致。
到目前为止,我们已经调试了连接,并在 OkHttp 中调试了 RealConnection 类,它实际上执行了握手,而无需协商客户端证书。
到目前为止,我们的研究表明这可能是由于服务器使用了可选的 ssl 客户端身份验证,但这不是我们可以改变的,所以......

  • 我们可以在 OkHttp 初始化期间传递任何其他选项来强制它使用客户端证书执行初始握手吗?
  • 如果 OkHttp 不是一个可行的选项,是否有任何其他 HTTP 客户端实现可以让我们在初始握手期间强制进行此类身份验证?
  • 最佳答案

    使用其构建器创建一个 HandshakeCertificates 对象。您将需要您的私钥、客户端证书和客户端的任何中间件。
    客户端还需要一个根证书才能让您的服务器信任它。如果您愿意,构建器具有使用内置证书颁发机构的功能。

      private OkHttpClient buildClient(
          HeldCertificate heldCertificate, X509Certificate... intermediates) {
        HandshakeCertificates.Builder builder = new HandshakeCertificates.Builder()
            .addTrustedCertificate(serverRootCa.certificate());
    
        if (heldCertificate != null) {
          builder.heldCertificate(heldCertificate, intermediates);
        }
    
        HandshakeCertificates handshakeCertificates = builder.build();
        return clientTestRule.newClientBuilder()
            .sslSocketFactory(
                handshakeCertificates.sslSocketFactory(), handshakeCertificates.trustManager())
            .build();
      }
    
    https://github.com/square/okhttp/blob/1ce86f35a9d957bae711fb81cec60abe9f43dda0/okhttp/src/test/java/okhttp3/internal/tls/ClientAuthTest.java#L126

    关于android - 如何强制 Android 11 上的 OkHttp 使用 TLS 1.3 发送 ssl 客户端证书身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68131346/

    相关文章:

    php - 使用外部数据库中的信息在登录时在 WordPress 网站中创建用户帐户

    ssl - Logstash 的 Icinga 输出插件导致 OpenSSL::SSL::SSLError:certificate verify failed 问题

    ssl - HTMLunit 浏览器自动化导致 SSL 错误

    java - Android - 检测移动到后台和前台的应用程序

    ios - 在 Parse (Swift) 中接受登录参数

    android - 如何获取从 onReceive() 触发的 Intent 的名称或类型

    python - 使用python使用cgi脚本登录网页

    ssl - sha1证书和sha2证书有什么区别?

    android - AutoCompleteTextView onSubmit 事件

    android - 操作栏溢出菜单项图标填充