Para fins de teste, estou tentando adicionar uma fábrica de soquetes ao meu cliente okHttp que confie em tudo enquanto um proxy é definido. Isso foi feito muitas vezes, mas minha implementação de uma fábrica de soquetes confiáveis parece estar faltando alguma coisa:
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);
Nenhuma solicitação está sendo enviada para fora do meu aplicativo e nenhuma exceção está sendo registrada, então parece que ele está falhando silenciosamente em okHttp. Após uma investigação mais aprofundada, parece que há uma exceção sendo engolida em okHttp Connection.upgradeToTls()
quando o aperto de mão está sendo forçado. A exceção que estou recebendo é:javax.net.ssl.SSLException: SSL handshake terminated: ssl=0x74b522b0: SSL_ERROR_ZERO_RETURN occurred. You should never see this.
O código a seguir produz um SSLContext
que funciona perfeitamente na criação de um SSLSocketFactory que não lança nenhuma exceção:
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();
}
O problema é que estou tentando remover todas as dependências do Apache HttpClient do meu aplicativo completamente. O código subjacente com Apache HttpClient para produzir o SSLContext
parece bastante direto, mas obviamente estou faltando algo porque não posso configurar meu SSLContext
para corresponder a isso.
Alguém seria capaz de produzir uma implementação SSLContext que faz o que eu gostaria sem usar o Apache HttpClient?
java.net.SocketTimeoutException: Read timed out