A scopo di test, sto cercando di aggiungere una fabbrica di socket al mio client okHttp che si fida di tutto mentre è impostato un proxy. Questo è stato fatto molte volte, ma la mia implementazione di una fabbrica di socket affidabile sembra mancare qualcosa:
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);
Nessuna richiesta viene inviata dalla mia app e nessuna eccezione viene registrata, quindi sembra che stia fallendo silenziosamente all'interno di okHttp. Dopo ulteriori indagini, sembra che ci sia un'eccezione che viene inghiottita in okHttp Connection.upgradeToTls()
quando viene forzata la stretta di mano. L'eccezione che mi viene data è:javax.net.ssl.SSLException: SSL handshake terminated: ssl=0x74b522b0: SSL_ERROR_ZERO_RETURN occurred. You should never see this.
Il codice seguente produce un SSLContext
che funziona come un fascino nella creazione di un SSLSocketFactory che non genera eccezioni:
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();
}
Il problema è che sto cercando di rimuovere completamente tutte le dipendenze di Apache HttpClient dalla mia app. Il codice sottostante con Apache HttpClient per produrre SSLContext
sembra abbastanza semplice, ma ovviamente mi manca qualcosa perché non posso configurare il mio SSLContext
in modo che corrisponda a questo.
Qualcuno sarebbe in grado di produrre un'implementazione di SSLContext che fa quello che vorrei senza usare Apache HttpClient?
java.net.SocketTimeoutException: Read timed out