android - 使用 OKHttp 调用 GET 时出现间歇性 SSLHandshakeException

标签 android ssl okhttp

编辑

对我来说这似乎不是重复的,因为所有其他问题都与可重复的问题有关,而不是像这个一样间歇性问题

结束编辑

我有一个运行一些 HTTP GET 的应用程序。 该应用程序在 API 21+ 上运行。 大多数情况下它工作正常,但很少有一个 HTTP GET 失败并出现以下错误:

D/OkHttp: --> GET https://url/url2?parm1=value1
D/OkHttp: --> END GET
D/OkHttp: <-- HTTP FAILED: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

当这种情况开始发生时,它会一直发生,直到我杀死该应用程序。 我正在使用 Retrofit 和 OKHttp 4.3.1。我现在要更新到最新版本,以防万一这是 OKHttp 中的错误,但我没有找到任何报告。

HTTP调用的代码是Retrofit的常用代码:

private val retrofit: Retrofit
    get() = Retrofit.Builder()
            .baseUrl(BuildConfig.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .addCallAdapterFactory(CoroutineCallAdapterFactory())
            .client(client)
            .build()

internal val service: AppService
    get() = retrofit.create<AppService>(AppService::class.java)

internal interface AppService {
    @GET
    suspend fun loadServerListAsync(@Url url: String): Response<List<Server>>
}

过去我在另一个应用程序中看到过此错误。在这种情况下,错误不是间歇性的,问题出在后端:他们更改了证书,但没有更新所有中间证书。

在这种情况下,错误看起来有所不同,因为它是间歇性的,杀死应用程序可以修复它。后端没有负载均衡器,所以不同的服务器不可能有不同的证书。

最佳答案

它可能与密码安全协议(protocol) TLSv1 相关,导致失败并回退到已弃用的 SSLv3。

防止 TLSv1 安全连接在模拟器中回退到 SSLv3 并抛出连接错误,因为 SSLv3 现已弃用且不安全(SSL 库中的 Android Studio 失败,通常是协议(protocol)错误)

使用 Google Play 服务安装更新的安全提供程序。 这有效地使您的应用程序可以访问较新版本的 OpenSSL 和 Java 安全提供程序,其中包括 SSLEngine 中对 TLSv1.2 的支持。 安装新的提供程序后,您可以按照通常的方式创建支持 SSLv3、TLSv1、TLSv1.1 和 TLSv1.2 的 SSLEngine。

这应该是您问题的答案:Javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: Failure in SSL library, usually a protocol error

关于android - 使用 OKHttp 调用 GET 时出现间歇性 SSLHandshakeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63396253/

相关文章:

线性布局上的android设置ontouchlistener不起作用

c# - 套接字和身份验证失败,因为远程方已关闭 WPF 中的传输流异常

.net - 无法在 DLL security.dll 中找到名为 EnumerateSecurityPackagesW 的入口点

java - 在 OkHttp java 中创建不记名授权 header

android - 如何从 okhttp3 缓存中删除条目

java - fragment 中的接口(interface)监听器

android - 错误:error: expected float but got (raw string) match-parent

java - 位图到 byte[] 到位图(不压缩)

c++ - 使用 OpenSSL API 准备 secret 文件以解密 Wireshark 中的 TLS 1.3 流量

android - 使用相同的连接池创建多个 OkHttp3 客户端