Zu Testzwecken versuche ich, meinem okHttp-Client eine Socket-Factory hinzuzufügen, die alles vertraut, während ein Proxy festgelegt ist. Dies wurde schon oft getan, aber meiner Implementierung einer vertrauenswürdigen Socket-Factory scheint etwas zu fehlen:
class TrustEveryoneManager implements X509TrustManager {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { }
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { }
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
}
OkHttpClient client = new OkHttpClient();
final InetAddress ipAddress = InetAddress.getByName("XX.XXX.XXX.XXX"); // some IP
client.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ipAddress, 8888)));
SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManager[] trustManagers = new TrustManager[]{new TrustEveryoneManager()};
sslContext.init(null, trustManagers, null);
client.setSslSocketFactory(sslContext.getSocketFactory);
Es werden keine Anfragen von meiner App gesendet und es werden keine Ausnahmen protokolliert. Es scheint also, dass dies in okHttp stillschweigend fehlschlägt. Bei weiteren Untersuchungen scheint es, dass eine Ausnahme in okHttp verschluckt wird, Connection.upgradeToTls()
wenn der Handschlag erzwungen wird. Die Ausnahme, die mir gegeben wird, ist:javax.net.ssl.SSLException: SSL handshake terminated: ssl=0x74b522b0: SSL_ERROR_ZERO_RETURN occurred. You should never see this.
Der folgende Code erzeugt eine, SSLContext
die beim Erstellen einer SSLSocketFactory, die keine Ausnahmen auslöst, wie ein Zauber wirkt:
protected SSLContext getTrustingSslContext() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
final SSLContextBuilder trustingSSLContextBuilder = SSLContexts.custom()
.loadTrustMaterial(null, new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return true; // Accepts any ssl cert whether valid or not.
}
});
return trustingSSLContextBuilder.build();
}
Das Problem ist, dass ich versuche, alle Apache HttpClient-Abhängigkeiten vollständig aus meiner App zu entfernen. Der zugrunde liegende Code mit Apache HttpClient zur Erstellung des Codes SSLContext
scheint recht einfach zu sein, aber mir fehlt offensichtlich etwas, da ich meinen nicht konfigurieren kannSSLContext
, dass er diesem entspricht.
Wäre jemand in der Lage, eine SSLContext-Implementierung zu erstellen, die das tut, was ich möchte, ohne Apache HttpClient zu verwenden?
quelle
java.net.SocketTimeoutException: Read timed out
Antworten:
Für den Fall, dass jemand hierher fällt, besteht die (einzige) Lösung, die für mich funktioniert hat, darin, das hier
OkHttpClient
erläuterte zu erstellen .Hier ist der Code:
quelle
SSL
und nichtTLS
?X509TrustManager.getAcceptedIssuers()
muss anstelle von ein leeres Array zurückgegeben werdennull
. Weitere Informationen finden Sie in diesem Commit (scrollen Sie nach unten und lesen Sie die Hinweise unter RealTrustRootIndex.java).Handshake failed
Ausnahme. Irgendwelche Vorschläge?Die folgende Methode ist veraltet
Erwägen Sie eine Aktualisierung auf
quelle
Aktualisieren Sie OkHttp 3.0, die
getAcceptedIssuers()
Funktion muss stattdessen ein leeres Array zurückgebennull
.quelle
Quelle: OkHttp-Dokumentation
quelle
sslContext
?sslContext
?Dies ist die Lösung von sonxurxo in Kotlin, falls jemand sie benötigt.
quelle
Ich habe eine Erweiterungsfunktion für Kotlin erstellt. Fügen Sie es ein, wo immer Sie möchten, und importieren Sie es beim Erstellen
OkHttpClient
.benutze es so:
quelle
Dies ist die Scala-Lösung, wenn jemand sie benötigt
}}
quelle
Sie sollten niemals versuchen, die Zertifikatvalidierung im Code zu überschreiben! Wenn Sie Tests durchführen müssen, verwenden Sie eine interne CA / Test-CA und installieren Sie das CA-Stammzertifikat auf dem Gerät oder Emulator. Sie können BurpSuite oder Charles Proxy verwenden, wenn Sie nicht wissen, wie Sie eine Zertifizierungsstelle einrichten.
quelle