Para fines de prueba, estoy tratando de agregar una fábrica de sockets a mi cliente okHttp que confía en todo mientras se establece un proxy. Esto se ha hecho muchas veces, pero mi implementación de una fábrica de sockets de confianza parece faltar algo:
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);
No se envían solicitudes desde mi aplicación y no se registran excepciones, por lo que parece que está fallando silenciosamente dentro de okHttp. Tras una mayor investigación, parece que hay una excepción que se está tragando en okHttp Connection.upgradeToTls()
cuando se fuerza el apretón de manos. La excepción que me están dando es:javax.net.ssl.SSLException: SSL handshake terminated: ssl=0x74b522b0: SSL_ERROR_ZERO_RETURN occurred. You should never see this.
El siguiente código produce un SSLContext
que funciona como un encanto para crear un SSLSocketFactory que no arroja ninguna excepción:
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();
}
El problema es que estoy tratando de eliminar todas las dependencias de Apache HttpClient de mi aplicación por completo. El código subyacente con Apache HttpClient para producir el SSLContext
parece bastante sencillo, pero obviamente me falta algo ya que no puedo configurar mi SSLContext
para que coincida con esto.
¿Alguien podría producir una implementación SSLContext que haga lo que me gustaría sin usar Apache HttpClient?
java.net.SocketTimeoutException: Read timed out