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 ein new DelegateHttpClient?
  • Ah ja, ich habe Herumspielen mit es für Alter, fixierte den OP - das ist nicht das problem aber
InformationsquelleAutor user705142 | 2011-04-13
Schreibe einen Kommentar