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?
java.net.SocketTimeoutException: Read timed out