À 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
Réponses:
Juste au cas où quelqu'un tomberait ici, la (seule) solution qui a fonctionné pour moi est de créer ce qui est
OkHttpClient
expliqué ici .Voici le code:
la source
SSL
et pasTLS
?X509TrustManager.getAcceptedIssuers()
doit retourner un tableau vide au lieu denull
. Pour plus d'informations, consultez ce commit (faites défiler vers le bas et consultez les notes sous RealTrustRootIndex.java).Handshake failed
exception. Aucune suggestion?La méthode suivante est obsolète
Pensez à le mettre à jour en
la source
Mettez à jour OkHttp 3.0, la
getAcceptedIssuers()
fonction doit renvoyer un tableau vide au lieu denull
.la source
Source: documentation OkHttp
la source
sslContext
?sslContext
?C'est la solution de sonxurxo à Kotlin, si quelqu'un en a besoin.
la source
J'ai créé une fonction d'extension pour Kotlin. Collez-le où vous le souhaitez et importez-le lors de la création
OkHttpClient
.utilisez-le comme ceci:
la source
C'est la solution Scala si quelqu'un en a besoin
}
la source
Vous ne devriez jamais chercher à remplacer la validation de certificat dans le code! Si vous devez effectuer des tests, utilisez une autorité de certification interne / de test et installez le certificat racine de l'autorité de certification sur l'appareil ou l'émulateur. Vous pouvez utiliser BurpSuite ou Charles Proxy si vous ne savez pas comment configurer une autorité de certification.
la source