我使用的是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,因为没有TLSProtocol.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)
您可以在此处获取委派套接字工厂https://github.com/square/okhttp/blob/c1a6dec505a62af07e4c117e777302bd136e107f/okhttp-testing-support/src/main/kotlin/okhttp3/DelegatingSSLSocketFactory.kt
但在不同的JVM或不同的Android版本上,这可能会有所不同。
这就是为什么我们有不同插座类型的适配器,如Android10SocketAdapter.kt、ConscryptSocketAdapter.kt等。
https://github.com/square/okhttp/blob/3ad1912f783e108b3d0ad2c4a5b1b89b827e4db9/okhttp/src/jvmMain/kotlin/okhttp3/internal/platform/android/SocketAdapter.kt#L35