Это все, и проблем больше нет.
я возникла странная проблема, из-за которой меня постоянно бросает модернизация
«Рукопожатие SSL прервано: ssl = 0x618d9c18: ошибка ввода-вывода во время системного вызова, сброс соединения по пиру»
в kitkat, тогда как тот же код работает нормально в устройствах lollipop. Я использую клиент OkHttpClient, как показано ниже
public OkHttpClient getUnsafeOkHttpClient() {
try {
final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] chain,
String authType) {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] chain,
String authType) {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[0];
}
} };
int cacheSize = 10 * 1024 * 1024; // 10 MB
Cache cache = new Cache(getCacheDir(), cacheSize);
final SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, trustAllCerts,
new java.security.SecureRandom());
final SSLSocketFactory sslSocketFactory = sslContext
.getSocketFactory();
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient = okHttpClient.newBuilder()
.cache(cache)
.sslSocketFactory(sslSocketFactory)
.hostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER).build();
return okHttpClient;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Я использую этот клиент в модернизации, как это
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(URL)
.client(getUnsafeOkHttpClient())
.addConverterFactory(GsonConverterFactory.create())
.build();
РЕДАКТИРОВАТЬ: добавлениеgetUnsafeOkHttpClient()
здесь не действует, и вообще не рекомендуется обходить проверку ssl с помощьюgetUnsafeOkHttpClient()
К вашему сведению: проблема заключалась в том, что конечная точка API поддерживает толькоTLS 1.2
который был отключен по умолчанию на устройствах Android16<device<20
, Таким образом, для16<device<20
создать кастомSSLSocketFactory