Android pre-lollipop-Geräte gibt Fehler "SSL handshake aborted: ssl=0x618d9c18: I/O error during system call, Connection reset by peer"
Iam mit diesem seltsamen Problem, in dem die Nachrüstung hält, warf mich
"SSL handshake aborted: ssl=0x618d9c18: I/O error during system call,
Connection reset by peer"
in kitkat, in der Erwägung, dass der gleiche code ist in Ordnung, die in lollipop-Geräte. Iam mit einem OkHttpClient client wie folgt
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);
}
}
Iam mit diesem Kunden in der Nachrüstung wie in diesem
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(URL)
.client(getUnsafeOkHttpClient())
.addConverterFactory(GsonConverterFactory.create())
.build();
BEARBEITEN : hinzufügen der getUnsafeOkHttpClient()
hat keine Wirkung und es ist überhaupt nicht empfohlen, zu umgehen, um den ssl-check mit getUnsafeOkHttpClient()
Zur info : Das Problem war, weil der api-Endpunkt unterstützt nur TLS 1.2
wurde deaktiviert standardmäßig auf android-Geräten 16<device<20
. Also für 16<device<20
, erstellen Sie eine benutzerdefinierte SSLSocketFactory
es gibt keinen Effekt, wenn ich die ssl-Instanz, so dass ich entfernt und die gesamte unsichere Kunde von retrofit, noch funktioniert es nur auf lollipop und nicht auf kitkat
Alles, was auf deinem server? Vielleicht kannst du einige logs von deinem server?
infact, die eine Kostenlose api von der api.Daten.reg.und ich dont haben Zugriff auf server-logs
möglich server-Seite-Problem?
InformationsquelleAutor Navneet Krishna | 2017-08-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Endlich eine Lösung gefunden, um dieses Problem, es ist nicht eine vollständige Lösung, da es ein hack erwähnt Jesse Wilson von okhttp, Platz hier. Wie ich bereits erwähnte, war es ein einfaches hack hatte wo ich Sie zum umbenennen meiner SSLSocketFactory variable
beachten Sie, dass es werfen würde Fehler geben, wenn Sie irgendwelche anderen Namen als Delegierter. Iam posting meine komplette Lösung unter
Dies ist mein TLSSocketFactory Klasse
und das ist, wie ich es mit okhttp-und retrofit -
Können Sie auch überprüfen, diese für mehr info
InformationsquelleAutor Navneet Krishna
Bekam ich SSL/TLS-info für die api.Daten.reg.hier - https://www.ssllabs.com/ssltest/analyze.html?d=api.data.gov.in
Sieht es aus wie es TLSv1 unterstützt.2 nur. Alte Android-Versionen in der Tat Probleme mit dem neusten TLS-Versionen. In "Handshake Simulation" auf der ssllabs Seite können Sie auch sehen, Ihre Probleme.
Sehen Aktivieren von TLS 1.2-Unterstützung in Android-Anwendung (läuft auf Android 4.1 JB) für verfügbare Lösungen.
Caused by: java.lang.IllegalStateException: Unable to extract the trust manager on okhttp3.internal.platform.AndroidPlatform@422663d0, sslSocketFactory is class navneet.com.devinered.service.TLSSocketFactory
InformationsquelleAutor algrid
Ich geändert @Navneet Krishna Antworten, weil die Methode OkHttpClient.Builder. builder.sslSocketFactory(tlsSocketFactory) ist jetzt veraltet.
Weisen Sie, wie in diesem:
InformationsquelleAutor Paweł Dedio
Neben Navneet Krishna musste ich den nächsten in meine App ist Klasse:
Laut https://developer.android.com/training/articles/security-gms-provider, und dies, weil ich brauchte ein update der security-Anbieter zum Schutz gegen SSL-exploits.
Meine App-Klasse:
Und Meine Tls12SocketFactory Klasse:
Und es funktioniert wie ein Charme in allen Geräten mit KitKat und höher.
InformationsquelleAutor Carlos Daniel
Ich denke, dass meine Lösung vielleicht auch jemand helfen.
In meinem Projekt, hatte ich das Bedürfnis zu tun, eine JSON-Anforderung über SSL auf einem älteren Android (4.4), und ich habe immer das Problem, wie bereits oben im thread.
Um es zu beheben alle ich tun musste, war, fügen Sie die Klasse Tls12SocketFactory genau wie oben.
Allerdings habe ich noch eine modifizierte code für mein Projekt Klasse
Fügte ich diese zu meinem
oncreate
geändert und die Funktion aus dem Kontext-wie unten, und das ist alles. Nicht mehr Fragen der SSL-Verbindung
Das ist alles und nicht mehr Fragen.
InformationsquelleAutor Waqas Ahmed