【发布时间】:2021-09-08 20:51:12
【问题描述】:
我们需要对只接受 TLS 1.3 连接的服务器执行基于证书的客户端身份验证。 服务器使用 Apache 2 和 HTTP 1.1,并配置为允许客户端证书身份验证但不强制执行,因为某些资源需要客户端身份验证,而其他资源不需要。
我们在 Android 11 上使用 OkHttp 4.9.1 来执行调用,并且我们遵循关于如何执行客户端身份验证的标准文档:https://github.com/square/okhttp/tree/master/okhttp-tls
但是服务器回复:403 (auth renegotiation not allowed)
这符合 TLS 1.3 规范,该规范不允许身份验证重新协商,除非在初始握手期间达成一致。
到目前为止,我们已经调试了连接,并在 OkHttp 中调试了 RealConnection 类,它实际上执行了握手,而无需协商客户端证书。
到目前为止,我们的研究表明这可能是由于服务器使用了 OPTIONAL ssl 客户端身份验证,但这不是我们可以改变的,所以......
- 我们可以在 OkHttp 初始化期间传递任何其他选项来强制它使用客户端证书执行初始握手吗?
- 如果 OkHttp 不是一个可行的选项,是否有任何其他 HTTP 客户端实现可以让我们在初始握手期间强制进行此类身份验证?
【问题讨论】:
-
除了 OkHttp 之外,您是否尝试过任何其他 HTTP 客户端?通常默认的 Java(=android) 实现具有更广泛的兼容性(即使它缺少配置选项和 OkHttp 的灵活性)
-
具有正确密钥库和信任管理器的 URLConnection 给出了完全相同的 403 错误,并且我们不希望标准 URLConnection 可以为此目的进行充分配置,而且我们已经在使用 OkHttp
标签: android authentication ssl okhttp