À des fins de test, j'essaie d'ajouter une fabrique de sockets à mon client okHttp qui fait confiance à tout pendant qu'un proxy est défini. Cela a été fait plusieurs fois, mais mon implémentation d'une fabrique de sockets de confiance semble manquer quelque chose:
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);
Aucune demande n'est envoyée depuis mon application et aucune exception n'est enregistrée, il semble donc qu'elle échoue silencieusement dans okHttp. Après une enquête plus approfondie, il semble qu'une exception soit engloutie dans okHttp Connection.upgradeToTls()
lorsque la poignée de main est forcée. L'exception que l'on me donne est:javax.net.ssl.SSLException: SSL handshake terminated: ssl=0x74b522b0: SSL_ERROR_ZERO_RETURN occurred. You should never see this.
Le code suivant produit un SSLContext
qui fonctionne comme un charme dans la création d'un SSLSocketFactory qui ne lève aucune exception:
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();
}
Le problème est que j'essaie de supprimer complètement toutes les dépendances Apache HttpClient de mon application. Le code sous-jacent avec Apache HttpClient pour produire le SSLContext
semble assez simple, mais il me manque évidemment quelque chose car je ne peux pas configurer mon SSLContext
pour correspondre à cela.
Est-ce que n'importe qui pourrait produire une implémentation de SSLContext qui fait ce que je voudrais sans utiliser Apache HttpClient?
java.net.SocketTimeoutException: Read timed out