【发布时间】: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