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);