【问题标题】:Intermittent SSLHandshakeException calling a GET with OKHttp [duplicate]间歇性 SSLHandshakeException 使用 OKHttp 调用 GET [重复]
【发布时间】:2020-12-03 08:48:18
【问题描述】:

编辑

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

结束编辑

我有一个运行一些 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.

当这种情况开始发生时,它会一直发生,直到我终止应用程序。 我正在使用带有 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>>
}

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

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

【问题讨论】:

  • 检查你的 URL 是否以 HTTP 到 https 开头
  • 感谢@RituSumanMohanty。网址是正确的。我在问题中对其进行了一些修改,但无论如何它都是 HTTPS
  • 另一个问题有一个 OkHttp 答案,所以这应该可以解决问题。还有一个已删除的答案,这将是反模式(您需要更多的声誉才能查看它)。这有点像这种愚蠢的方法:stackoverflow.com/questions/37686625/…
  • @MartinZeitler。如果只是证书不受信任的问题,问题怎么可能是间歇性的?不可能是服务器上的间歇性问题,因为它足以杀死应用程序
  • @kingston 您需要配置 Retrofit 使用不同的 OkHttp 客户端。通常检查 SSL 问题的第一件事是在服务器上运行 SSL 检查,以查看正在处理的证书;然后仍然可以设置本地信任库。见ssllabs.com/ssltest

标签: android ssl okhttp


【解决方案1】:

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

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

使用 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

【讨论】:

  • 谢谢。所有这些问题似乎都与旧版本的操作系统有关。我已经在使用 minSDK=API 21。这仍然相关吗?
  • 是的,它仍然是相关的。去年我的 minSDK=21 也遇到了这个问题。
猜你喜欢
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 2018-08-26
  • 2023-03-23
  • 2016-06-04
  • 1970-01-01
相关资源
最近更新 更多