У меня есть сценарий, в котором я должен передать сертификат на свой сервер, а затем сервер отправляет мне свой сертификат, который я должен принять для доступа к серверу.Я использовал для этого HttpURLConnection без проблем.
Однако недавно у меня возникла проблема с HttpURLConnection.Код, который я использовал, получил изображение с сервера HTTPS.Если изображение было маленьким (<500 КБ), никаких проблем не возникало.Однако с большими изображениями я получил это: </p>
javax.net.ssl.SSLProtocolException: Ошибка чтения: ssl = 0x3c97e8: сбой в библиотеке SSL, обычно ошибка протокола
Я читал об этомв Интернете, и многие люди говорили, что использование HttpClient вместо HttpURLConnection было подходящим способом (например, этот сайт http://soan.tistory.com/62, думаю, что он написан на корейском, я не могу его прочитать, но это то, что я думаюэто говорит).
Это мой старый код, использующий URLConnection:
public static URLConnection CreateFromP12(String uri, String keyFilePath,
String keyPass, TrustManager[] trustPolicy, HostnameVerifier hv) {
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
KeyStore keyStore = KeyStore.getInstance("PKCS12");
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
keyStore.load(new FileInputStream(keyFilePath),
keyPass.toCharArray());
kmf.init(keyStore, keyPass.toCharArray());
sslContext.init(kmf.getKeyManagers(), trustPolicy, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext
.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(hv);
} catch (Exception ex) {
return null;
}
URL url;
URLConnection conn;
try {
url = new URL(uri);
conn = url.openConnection();
} catch (MalformedURLException e) {
return null;
} catch (IOException e) {
return null;
}
return conn;
}
А это новый, использующий HttpClient:
public class HttpC2Connection {
public static HttpEntity CreateHttpEntityFromP12(String uri,
String keyFilePath, String keyPass) throws Exception {
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream(keyFilePath), keyPass.toCharArray());
SSLSocketFactory sf = new MySSLSocketFactory(keyStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(params,
registry);
HttpClient httpclient = new DefaultHttpClient(ccm, params);
HttpGet httpget = new HttpGet(uri);
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
return entity;
}
Но теперь,используя HttpClient, мой сервер возвращает мне сообщение об ошибке, в котором говорится, что я должен передать сертификат, поэтому я предполагаю, что
SSLSocketFactory sf = new MySSLSocketFactory(keyStore);
не загружает мой сертификат.
Итак, как я могу сделатьследующие две вещи одновременно:
1.) Передать сертификат на мой сервер;2.) Принять любой сертификат с моего сервера
Используя класс HttpClient?
PS: Я использую Android 3.0
Спасибо