gpt4 book ai didi

okhttp - 我可以使用 OkHttp 将本地 IP 地址绑定(bind)到我的 SSLSocketFactory 吗?

转载 作者:行者123 更新时间:2023-12-05 02:43:03 27 4
gpt4 key购买 nike

我正在努力让 Android 上的 OkHttpClient 使用自定义证书发出 HTTPS 请求,同时绑定(bind)到特定网络接口(interface)的本地地址。我目前对此的尝试使用以下 OkHttpClient:

val client = OkHttpClient.Builder()
.readTimeout(2, TimeUnit.SECONDS)
.connectTimeout(2, TimeUnit.SECONDS)
.sslSocketFactory(
MySocketFactory(
getSslContext().socketFactory,
localAddress
),
MyTrustManager()
)
.build()

MySocketFactory 类实现为:

class MySocketFactory(
private val delegate: SSLSocketFactory,
private val localAddress: InetAddress
) : SSLSocketFactory() {
override fun createSocket(): Socket {
Timber.i("createSocket has been called!")
val socket = delegate.createSocket()
socket.bind(InetSocketAddress(localAddress, 0))
return socket
}

[other overrides of the various abstract createSocket methods, each of which throws an UnsupportedOperationException]

override fun getDefaultCipherSuites() = delegate.defaultCipherSuites

override fun getSupportedCipherSuites() = delegate.supportedCipherSuites
}

这主要基于 documentation from the OkHttp GitHub site它描述了如何将值传递给 Builder.socketFactory() 允许我们通过覆盖无参数的 createSocket 方法将每个套接字绑定(bind)到特定地址。然而,docs for sslSocketFactory不要提及任何关于能够绑定(bind)套接字的事情。当我使用上述代码运行我的应用程序时,从未生成 createSocket 日志条目,这表明工厂已被完全忽略。因此,永远不会到达 HTTP 端点。

如果我在没有包装器 MySocketFactory 类的情况下尝试相同的设置 - 而不是将 getSslContext().socketFactory 直接传递到 Builder.sslSocketFactory -然后我可以很好地联系端点,假设当时我的机器上只有一个本地地址。

所以我的问题是:这是否可能与自定义 SSLSocketFactory 相关?

最佳答案

是的!但不是自定义 SSLSocketFactory,而是自定义常规 SocketFactory。当 OkHttp 创建任何套接字时,它总是首先使用常规的 SocketFactory,然后可能用 SSL 包装它。这对于 TLS 隧道是必需的,但无处不在。

关于okhttp - 我可以使用 OkHttp 将本地 IP 地址绑定(bind)到我的 SSLSocketFactory 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67091352/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com