У меня возникли трудности с возобновлением сеанса SSL на Android с использованием HttpClient.
Я обрабатываю сервер каждые 90 секунд (это для промышленных устройств только с одной функцией), поэтому мне нужно возобновить сеанс или использовать skyrockets для данных с нескольких килобайт в час до 150-200 кБ, что неустойчиво, Сервер встроен в Jetty в Restlet и поддерживает возобновление сеансов SSL, когда я тестирую его с помощью OpenSSL, насколько я могу судить.
Я повторно использую свой объект HttpClient, так что это не так. Android имеет специальный SSLCertificateSocketFactory, который я также пробовал, и он также не работает.
Есть ли что-то, чего я здесь совсем не хватает? Я предположил, что HttpClient сделает это автоматически, я не уверен, что я делаю неправильно, и никто в Интернете, похоже, не сталкивается с аналогичной проблемой.
Я установил httpClient через:
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;
}
}
(Я использую порт 444 специально)
Затем просто повторно использую объект HttpClient, используя простую авторизацию HttpGet и Basic.
Что я здесь делаю неправильно? Кто-нибудь, пожалуйста, помогите!