Tengo muchas dificultades para reanudar una sesión SSL en Android usando HttpClient.Reutilización de sesiones SSL en Android con HttpClient
Estoy sondeando un servidor cada 90 segundos (es para dispositivos industriales con una sola función), así que necesito reanudar la sesión o si el uso de datos se dispara de unos pocos kB por hora hasta 150-200kB, que es insostenible El servidor está incrustado Jetty en Restlet, y admite la reanudación de las sesiones SSL cuando lo pruebo usando OpenSSL hasta donde yo sé.
Estoy reutilizando mi objeto HttpClient, así que no es eso. Android tiene un SSLCertificateSocketFactory específico que también he probado y tampoco parece funcionar.
¿Hay algo que me falta por completo aquí? Supuse que HttpClient haría esto automáticamente, no estoy seguro de lo que estoy haciendo mal, y nadie en Internet parece enfrentarse a un problema similar.
He configurado el HttpClient a través de:
public HttpClient getNewHttpClient(Context context) {
try {
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
HttpConnectionParams.setStaleCheckingEnabled(params, false);
HttpConnectionParams.setConnectionTimeout(params, 4 * 1000);
HttpConnectionParams.setSoTimeout(params, 5 * 1000);
HttpConnectionParams.setSocketBufferSize(params, 8192);
HttpClientParams.setRedirecting(params, false);
SSLSessionCache sslSession = new SSLSessionCache(context);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", SSLCertificateSocketFactory.getHttpSocketFactory(10*60*1000, sslSession), 444));
//registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 444));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);
return new DelegateHttpClient(ccm, params);
} catch (Exception e) {
return new DefaultHttpClient();
}
}
private static class DelegateHttpClient extends DefaultHttpClient {
private DelegateHttpClient(ClientConnectionManager ccm, HttpParams params) {
super(ccm, params);
}
@Override
protected HttpContext createHttpContext() {
HttpContext context = new BasicHttpContext();
context.setAttribute(ClientContext.AUTHSCHEME_REGISTRY, getAuthSchemes());
context.setAttribute(ClientContext.COOKIESPEC_REGISTRY, getCookieSpecs());
context.setAttribute(ClientContext.CREDS_PROVIDER, getCredentialsProvider());
CookieStore cookieStore = new BasicCookieStore(); // Create a local instance of cookie store
context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
return context;
}
}
(estoy usando el puerto 444 a propósito)
A continuación, sólo volver a usar el objeto HttpClient usando un simple autorización HttpGet y básico.
¿Qué estoy haciendo mal aquí? Cualquiera, por favor ayuda!
'return new DefaultHttpClient (ccm, params);' - ¿Debería ser un 'nuevo DelegateHttpClient'? – sarnold
Ah, sí, he estado metiéndome con eso durante años, arreglé el OP, aunque ese no es el problema – user705142