Die Wiederverwendung von SSL-Sitzungen in Android mit HttpClient
Ich habe eine Menge von Schwierigkeiten mit der Aktivierung einer SSL-Sitzung auf Android mit HttpClient.
Ich bin polling server alle 90 Sekunden (es ist für industrielle Geräte mit einer Funktion nur), also muss ich die Sitzung fortgesetzt, oder andere Daten über die Nutzung von Raketen von ein paar kB einer Stunde bis zu 150-200kB, was unhaltbar ist. Der server embedded Jetty in Restlet, und unterstützt die Wiederaufnahme von SSL-Sitzungen, wenn ich es testen mit OpenSSL soweit ich das sagen kann.
Ich bin wiederverwenden meine HttpClient-Objekt, so dass es nicht. Android hat einen bestimmten SSLCertificateSocketFactory habe ich auch probiert und es scheint auch nicht zu funktionieren.
Gibt es etwas, was ich vollständig fehlt hier? Ich hatte angenommen, dass HttpClient würde dies automatisch tun, ich bin mir nicht sicher, was ich falsch mache, und niemand auf das internet zu sein scheint, kommen gegen ein ähnliches problem.
Ich habe den httpClient über:
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;
}
}
(Ich bin über port 444 auf Zweck)
Dann nur, dass ich die Wiederverwendung der HttpClient-Objekt mit einem einfachen HttpGet und Grundlegende Berechtigung.
Was mache ich hier falsch !? Jemand, bitte Hilfe!!!
return new DefaultHttpClient(ccm, params);
-- sollte das einnew DelegateHttpClient
?- Ah ja, ich habe Herumspielen mit es für Alter, fixierte den OP - das ist nicht das problem aber
Du musst angemeldet sein, um einen Kommentar abzugeben.
Behoben. Es ist nun die Verwendung von Sitzungen und verbrauchen kleinste Mengen von Daten.
Entfernen, die Zeile behebt es, trotz HttpClient noch nie über http/port 80. Warum das funktioniert habe ich keine Ahnung.