[英]How OkHttpClient can establish TLS connection via http2 with server that does not support ALPN?
我正在使用 OkHttpClient 3.14.9。 我需要使用 TLSv1.3 和 http2 协议建立连接。 问题是服务器不支持 ALPN(OkHttpClient 使用这个扩展与服务器建立使用哪个版本的 http 协议)。
在服务器端 http1.1 被禁用,只有 http2 被启用。 客户端没有成功建立连接。 当服务器启用 http1.1 时,我的客户端通过 http1.1 连接到服务器。
据我了解,这意味着客户端和服务器之间没有关于 http 版本的协商:客户端正在尝试通过 ALPN 进行协商 -> 服务器不“理解”客户端 -> 客户端认为服务器不支持 http2 并尝试连接http1.1
那么,如果不是 ALPN,OkHttpClient 是否有其他方法可以通过 http2 建立 TLS 连接? (重要的是,连接是 TLS,因为没有 TLS Protocol.H2_PRIOR_KNOWLEDGE
效果很好)
像下面这样的东西应该/可以在 JDK9 上工作。 但它很难测试,因为它实际上是一个损坏的服务器。
val sslSocketFactory = context.socketFactory
val wrapped = object : DelegatingSSLSocketFactory(sslSocketFactory) {
override fun configureSocket(sslSocket: SSLSocket): SSLSocket {
return object : DelegatingSSLSocket(sslSocket) {
override fun getApplicationProtocol(): String {
return "h2"
}
}
}
}
val client = OkHttpClient.Builder()
.sslSocketFactory(wrapped, trustManager)
.build()
val response = client.newCall(Request.Builder().url("https://api.twitter.com/").build()).execute()
println(response.protocol)
但在不同的 JVM 或不同的 Android 版本上,这可能会有所不同。
这就是我们为不同套接字类型(如 Android10SocketAdapter.kt、ConscryptSocketAdapter.kt 等)提供适配器的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.