Vertraue allen Zertifikaten mit okHttp

Zu Testzwecken versuche ich, meinem okHttp-Client eine Socket-Factory hinzuzufügen, die allen Anforderungen vertraut, während ein Proxy festgelegt ist. Dies wurde schon oft gemacht, 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 aus meiner App gesendet und es werden keine Ausnahmen protokolliert, sodass es in okHttp stillschweigend fehlschlägt. Bei weiteren Untersuchungen scheint es, dass in okHttp's eine Ausnahme verschluckt wirdConnection.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 eineSSLContext Das funktioniert wie ein Zauber beim Erstellen einer SSLSocketFactory, die keine Ausnahmen auslöst:

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 von meiner App zu entfernen. Der zugrunde liegende Code mit Apache HttpClient zur Erzeugung desSSLContext scheint einfach zu sein, aber ich vermisse offensichtlich etwas, da ich mein nicht konfigurieren kannSSLContext dazu passen.

Wäre jemand in der Lage, eine SSLContext-Implementierung zu erstellen, die das tut, was ich möchte, ohne Apache HttpClient zu verwenden?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage