Android
- 7 ответов
- 0 вопросов
5
Вклад в тег
try{// Работа с SSL пробрасывает исключения, порой очень неприятные и непонятно как устранимые
KeyStore keyStore = KeyStore.getInstance("Your_Type_Of_Certificate");//делаем хранилище ключей, аналогичное типу Вашего сертификата
InputStream in = ...// крепим к потоку сам файл сертификата
try{
keyStore.load(in, "Your_Password".toCharArray());//грузим в хранилище сертификат, дополняя его паролем от сертификата
}catch (Exception ex){
Log.wtf("OMG",ex.getLocalizedMessage());//либо файла нет, либо пароль не тот
}finally {
in.close();
}
// Один из "столпов" клиентского SSL, отвечает за хранение всех сертификатов. Имеются разные варианты его настройки(разные алгоритмы)
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, "Your_Password".toCharArray());
KeyManager[] keyManagers = kmf.getKeyManagers();
//Второй элемент, который "должен" проверять, валидны ли наши сертификаты
TrustManager[] wrappedTrustManagers = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) { }
public void checkServerTrusted(X509Certificate[] certs, String authType) {}
}
};
SSLContext sslContext = SSLContext.getInstance("TLSv1");//Создаем контекст SSL по типу протокола
sslContext.init(keyManagers, wrappedTrustManagers, new java.security.SecureRandom());//инициализируем его
return sslContext;// Радуемся =)
}catch (Exception ex){
Log.wtf("OMG", ex.getLocalizedMessage());// Печалимся ='(
return null;
}
//Устанавливаем контекст
HttpsURLConnection.setDefaultSSLSocketFactory(методНаписанныйВыше().getSocketFactory());
//Та самая "защита" которая говорит "мне плевать на всех, коннекчусь куда хочу". Виной этому самоподписанный сертификат.
HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
SchemeRegistry registry = new SchemeRegistry();
SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
registry.register(new Scheme("Type_Of_Connection", socketFactory, 443));
SingleClientConnManager mgr = new SingleClientConnManager(yourConnection.getParams(), registry);
//Я работаю по https, по этому пример для него
DefaultHttpClient httpClient = new DefaultHttpClient(mgr, yourConnection.getParams());
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);