Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно пояснить рабочий код (SSL протокол), setupSSL 
V
    Опции темы
Flashed
Дата 5.3.2012, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 3.6.2010

Репутация: нет
Всего: 1



Как-то возникла проблема отправки  post запроса https.
Нашел рабочую функцию:
Код

private void setupSSL(){
        SocketFactory blindFactory = null;
        TrustManager[] blindTrustMan = { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted(X509Certificate[] c, String a) {
            }
            public void checkServerTrusted(X509Certificate[] c, String a) {  }
        } };
        try { SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, blindTrustMan, new SecureRandom());
        blindFactory = sc.getSocketFactory();
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        }

        try
        {
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, blindTrustMan, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        }
        catch (Exception localException)
        {
        }
    }

Если её вызывать перед открытием соединения, (перед url.openConnection()), то запрос https отправляется без проблем.
Что делает эта функция? Можете объяснить поэтапно? 

Это сообщение отредактировал(а) Flashed - 5.3.2012, 18:11
PM MAIL   Вверх
javafreshglow
Дата 18.3.2012, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 18.3.2012

Репутация: нет
Всего: нет



Цитата(Flashed @ 5.3.2012,  18:04)
Как-то возникла проблема отправки  post запроса https.
Нашел рабочую функцию:
Код

private void setupSSL(){
        SocketFactory blindFactory = null;
        TrustManager[] blindTrustMan = { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted(X509Certificate[] c, String a) {
            }
            public void checkServerTrusted(X509Certificate[] c, String a) {  }
        } };
        try { SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, blindTrustMan, new SecureRandom());
        blindFactory = sc.getSocketFactory();
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        }

        try
        {
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, blindTrustMan, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        }
        catch (Exception localException)
        {
        }
    }

Если её вызывать перед открытием соединения, (перед url.openConnection()), то запрос https отправляется без проблем.
Что делает эта функция? Можете объяснить поэтапно?

Добрый день.

Создавая подобный менеждер,
Код

new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted(X509Certificate[] c, String a) {
            }
            public void checkServerTrusted(X509Certificate[] c, String a) {  }
        }

Вы доверяете всем сертификатом без проверки.

Далее создаем защищенный context 
Код

SSLContext sc = SSLContext.getInstance("SSL");


Инициализируем, успользуя созданный ранее, менеджер (который всем доверяет). Если не нужно использовать ключи клиента, то можно, как Вы сделали:
Код

sc.init(null, blindTrustMan, new SecureRandom());


Добавим фабрику для создания новых защищенных соединений:
Код

HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());


Для использования ключей, см. ниже.

Также можно создать хранилище ключей клиента:
Код

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());


загрузить ключи (например, из базы)
Код

byte[] key = ... - читаем ключ в массив.
keyStore.load(new ByteArrayInputStream(key), "password".toCharArray());


фабрика для создания менеждера ключей
Код

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");


инициализируем хранилище:
Код

kmf.init(keyStore, "password".toCharArray());


инициализируем ssl контекст, с ключами клиента, для подключения к серверу и менеждером, который доверяет всем серверам:
Код

sc.init(kmf.getKeyManagers(), new TrustManager[]{tm}, null);


tm - Ваш менеджер, который "всем доверяет", созданный в самом начале.

Фабрика для создания защищенных соединений, используя ssl контекст (для сравнения - без ключей см. выше):
Код

org.apache.http.conn.ssl.SSLSocketFactory ssf = new org.apache.http.conn.ssl.SSLSocketFactory(sc);


создаем http клиента:
Код

DefaultHttpClient httpclient = new DefaultHttpClient();


Регистрируем "схему" 
Код

httpclient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", 443, ssf));

схема учитывает особенности протокола.

Далее все просто:
Создаем объект для get запроса
Код

String url = "https://.....";
httpget = new HttpGet(url);


выполним запрос:
Код

HttpResponse response = httpclient.execute(httpget);


проверим ответ:
Код

int statusList = response.getStatusLine();


И получаем заголовок и тело:
Код

HttpEntity entity = response.getEntity();
Header[] has = response.getHeaders(_headerName);


Спрашивайте.
PM MAIL   Вверх
Flashed
Дата 10.5.2012, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 3.6.2010

Репутация: нет
Всего: 1



Исчерпывающий ответ. Большое спасибо!  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0581 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.