HttpClient: handshake ssl sur chaque demande
- Je utiliser statique HttpClient, et il fonctionne très lentement sur https. J'ai ajouté -Djavax.net.debug=ssl et a constaté que la poignée de main est lancé pour chaque requête https nouveau.
ressemble, il ne peut pas réutiliser les anciennes session, mais je ne peux pas trouver pourquoi.
9007199254743735, setSoTimeout(0) called
Allow unsafe renegotiation: false
Allow legacy hello messages: true
Is initial handshake: true
Is secure renegotiation: false
9007199254743735, setSoTimeout(0) called
%% No cached client session
*** ClientHello, SSLv3
...
%% Didn't cache non-resumable client session: [Session-1, SSL_RSA_WITH_RC4_128_MD5]
...
Is initial handshake: true
BTW. avant j'ai été confronté à un autre problème sur cette machine: "Reçu alerte fatale: bad_record_mac", il a été résolu en ne permettant que le SSLv3
UPD1: HttpClient code d'initialisation
final SSLContext sslCtx;
sslCtx = SSLContext.getInstance("SSL");
sslCtx.init(null, new TrustManager[]{new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] cert,
String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] cert,
String authType) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}}, null);
X509HostnameVerifier verifier = new X509HostnameVerifier() {
@Override
public void verify(String string, SSLSocket ssls) throws IOException {
}
@Override
public void verify(String string, X509Certificate xc) throws SSLException {
}
@Override
public void verify(String string, String[] strings, String[] strings1) throws SSLException {
}
@Override
public boolean verify(String string, SSLSession ssls) {
return true;
}
};
final SSLSocketFactory socketFactory = new SSLv3SocketFactory(sslCtx, verifier);
final SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("https", 443, socketFactory));
final PoolingClientConnectionManager cm = new PoolingClientConnectionManager(registry);
cm.setMaxTotal(100);
cm.setDefaultMaxPerRoute(50);
final HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setSoTimeout(httpParams, timeout);
httpClient = new DefaultHttpClient(cm, httpParams);
((DefaultHttpClient) httpClient).setKeepAliveStrategy(new ConnectionKeepAliveStrategy() {
@Override
public long getKeepAliveDuration(HttpResponse hr, HttpContext hc) {
return 0;
}
});
httpClient.getParams().setParameter("http.socket.timeout", 900000);
UPD2: modifié SSLSocketFactory("Reçu alerte fatale: bad_record_mac")
public class SSLv3SocketFactory extends SSLSocketFactory {
private final javax.net.ssl.SSLSocketFactory socketfactory;
public SSLv3SocketFactory(SSLContext sslContext, X509HostnameVerifier hostnameVerifier) {
super(sslContext, hostnameVerifier);
this.socketfactory = sslContext.getSocketFactory();
}
@Override
public Socket createLayeredSocket(
final Socket socket,
final String host,
final int port,
final boolean autoClose) throws IOException, UnknownHostException {
SSLSocket sslSocket = (SSLSocket) this.socketfactory.createSocket(
socket,
host,
port,
autoClose);
sslSocket.setEnabledProtocols(new String[]{"SSLv3"});
return sslSocket;
}
@Override
public Socket connectSocket(
final Socket socket,
final InetSocketAddress remoteAddress,
final InetSocketAddress localAddress,
final HttpParams params) throws IOException, UnknownHostException, ConnectTimeoutException {
if (socket instanceof SSLSocket) {
((SSLSocket) socket).setEnabledProtocols(new String[]{"SSLv3"});;
}
return super.connectSocket(socket, remoteAddress, localAddress, params);
}
}
UPD3: Problème n'existe que pour SSLv3, TLSv1 fonctionne très bien
Merci de poster le code de la façon dont vous faites les demandes du client http.
J'ai ajouté HttpClient code d'initialisation, que je viens de l'appeler httpClient.execute(), l'url est toujours la même
J'ai ajouté HttpClient code d'initialisation, que je viens de l'appeler httpClient.execute(), l'url est toujours la même
OriginalL'auteur John | 2013-07-29
Vous devez vous connecter pour publier un commentaire.
HttpClient ré-utilise persistante des connexions SSL avec authentification du client que si elle peut s'assurer qu'ils appartiennent au même utilisateur /contexte de sécurité (pour des raisons évidentes).
Assurez-vous d'utiliser la même
HttpContext
pour tous liés logiquement demandes. Cela permettra d'assurer la sécurité principal (DN du certificat client) se propage entre les requêtes HTTP.Suivi
Il écoute le serveur ne veut tout simplement pas les connexions à être ré-utilisé. Chaque réponse contient
'Connection: close'
directive qui invite le client à fermer les connexions après la réception de la réponse. Il peut arriver, cependant, que le serveur traite les différents clients varie en fonction de la demande de composition de message. Essayez de camouflage HttpClient en utilisant un autreUser-Agent
valeur d'en-tête et voir si cela fait une différence.Je serais surpris si HttpClient ou HttpContext avait quelque chose à faire avec elle. SSL prise en charge de Session se produit à la SSLSocket couche, pas la couche HTTP.
Croyez-moi, il n'. HttpClient traite les connexions SSL avec authentification du client en tant que dynamique et s'appuie sur le contexte de propager cet état
veuillez voir le suivi
Pas de. La question est à propos de " handshake SSL sur chaque demande. Les sessions SSL peut s'étendent à travers les connexions TCP. Ils ne sont pas touchés par la connexion HTTP persistance ou l'absence de. Une nouvelle connexion TCP rejoindre un existant session SSL réalise un très abrégée de la connexion SSL.
OriginalL'auteur ok2c
Comme vous le dites dans un commentaire que le problème se produit uniquement avec un serveur, le problème est à ce serveur. Ils ont un très court délai d'expiration de session SSL, ou désactivé la reprise de la session au total quelque sorte.
Il n'y a rien que vous pouvez faire à ce sujet à partir de votre fin.
Il fonctionne avec le protocole HTTPS?
comme je le vois dans un violon, il fonctionne avec le protocole https
OriginalL'auteur user207421