【发布时间】:2015-08-12 20:31:12
【问题描述】:
在过去的几周里,我们的客户开始看到 100 多个“SSLException 错误 - 对等连接重置”,我不知道为什么
-
我们使用的是带有okhttp的Retrofit,没有特殊配置
public class OkHttpClientProvider implements IOkHttpClientProvider { OkHttpClient okHttpClient; public OkHttpClientProvider() { this.okHttpClient = createClient(); } public OkHttpClient getOkHttpClient() { return this.okHttpClient; } private OkHttpClient createClient() { return new OkHttpClient(); } }
上面的客户端提供者是一个单例。 RestAdapter 是使用这个注入的客户端构建的(我们使用 dagger) -
RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder()
.setConverter(converter)
.setEndpoint(networkRequestDetails.getServerUrl())
.setClient(new OkClient(okHttpClientProvider.getOkHttpClient()))
.setErrorHandler(new NetworkSynchronousErrorHandler(eventBus))
);
基于我发现的堆栈溢出解决方案 -
服务器的存活时间为180秒,OkHttp默认为300秒
服务器在其标头中返回“Connection: close”,但客户端请求发送“Connection: keepAlive”
服务器支持 TLS 1.0 / 1.1 / 1.2 并使用 Open SSL
我们的服务器最近已转移到另一个地理位置的另一个托管服务提供商,所以我不知道这些是否是 DNS 故障
我们尝试过调整 keepAlive 等内容,在服务器上重新配置 OpenSSL,但由于某种原因,Android 客户端不断收到此错误
当您尝试使用该应用发布内容或拉取刷新时,它会立即发生,没有任何延迟(它甚至不会进入网络或在此异常发生之前有延迟,这意味着连接已经破碎的)。但是多次尝试以某种方式“修复它”并且我们获得了成功。以后会再次发生
我们已使服务器上的 DNS 条目无效,以查看是否是导致它的原因,但没有帮助
它主要发生在 LTE 上,但我也在 Wifi 上看到过
我不想禁用保持活动,因为大多数现代客户端都不会这样做。此外,我们正在使用 OkHttp 2.4,这是冰淇淋三明治设备上的一个问题,所以我希望它应该处理这些潜在的网络问题。 iOS 客户端也会遇到这些异常,但要少近 100 倍(iOS 客户端使用 AFNetworking 2.0)。我现在正在努力寻找新的尝试,有什么帮助/想法吗?
更新 - 通过 okhttp 添加完整的堆栈跟踪
retrofit.RetrofitError: Read error: ssl=0x9dd07200: I/O error during system call, Connection reset by peer
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:390)
at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
at java.lang.reflect.Proxy.invoke(Proxy.java:397)
at $Proxy15.getAccessTokenUsingResourceOwnerPasswordCredentials(Unknown Source)
at com.company.droid.repository.network.NetworkRepository.getAccessTokenUsingResourceOwnerPasswordCredentials(NetworkRepository.java:76)
at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:88)
at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:23)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: javax.net.ssl.SSLException: Read error: ssl=0x9dd07200: I/O error during system call, Connection reset by peer
at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:699)
at okio.Okio$2.read(Okio.java:137)
at okio.AsyncTimeout$2.read(AsyncTimeout.java:211)
at okio.RealBufferedSource.indexOf(RealBufferedSource.java:306)
at okio.RealBufferedSource.indexOf(RealBufferedSource.java:300)
at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:196)
at com.squareup.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191)
at com.squareup.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80)
at com.squareup.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:917)
at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:793)
at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:439)
at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:384)
at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)
at com.squareup.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105)
at com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:25)
at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:73)
at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:321)
at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
at java.lang.reflect.Proxy.invoke(Proxy.java:397)
at $Proxy15.getAccessTokenUsingResourceOwnerPasswordCredentials(Unknown Source)
at com.company.droid.repository.network.NetworkRepository.getAccessTokenUsingResourceOwnerPasswordCredentials(NetworkRepository.java:76)
at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:88)
at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:23)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
]}
【问题讨论】:
-
问题是在OkHttp 2.3下出现的吗?我们试图在 2.4 中改进连接性,但您可能遇到了我们退步的情况。
-
你没有用
setRetryOnConnectionFailure()配置你的OkHttpClient是吗? -
嗨@JesseWilson,不是吗?以前没做过,我可以试试
-
我在尝试将多部分上传到 AWS 时也遇到了 SSLException,这是日志的粘贴 pastebin.com/My63htPg (ok v 2.4.0)
-
有同样的问题。这里有什么解决方案吗?
标签: android http ssl retrofit okhttp