Работаем с протоколом HTTPS в Android

В настоящее время всё больше интернет ресурсов переходят на работу через защищённое соединение HTTPS (HyperText Transfer Protocol Secure). Необходимость этого перехода обусловлена тем, что в случае стандартного протокола HTTP данные между сервером и клиентом так или иначе передаются в открытом виде. Что не всегда приемлемо даже для «обычных сайтов», не говоря уже о web ресурсах которые работают с конфиденциальной информацией (например, ресурсы финансовых, государственных, медицинских учреждений и т.д.).

Естественно, что вслед за самими ресурсами на HTTPS переходят и приложения, взаимодействующие с ними.

По существу, использование HTTPS в Android во многом схоже с обычным HTTP (пример его использования в Android можно найти здесь). Единственные отличия:

  • Вместо класса HttpURLConnection используется класс HttpsURLConnection;
  • Необходимо задавать режим проверки сертификатов;
  • Для соединения необходимо явно вызывать метод connect класса HttpsURLConnection.

Рассмотрим процесс работы с HTTPS более подробно.

Перед тем, как инициировать подключение необходимо задать механизм проверки сертификата web узла. Существует целый ряд таких механизмов, но наиболее простой из них основан на классе HostnameVerifer.

Создадим объект класса HostnameVerifer, который будет отвечать за проверку сертификата.

HostnameVerifier hostnameVerifier = new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
        return hv.verify("example.com", session);
    }
};

В методе verify мы проверяем соответствие сертификата домену web узла.

Далее создаём экземпляр класса HttpsURLConnection и устанавливаем созданный нами объект HostnameVerifier в качестве проверяющего для данного конкретного соединения.

URL url = new URL("https://example.com/");
HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
urlConnection.setHostnameVerifier(hostnameVerifier);

После этого можно вызывать метод connect и при успешном соединении работать с web узлом. После завершения работы соединение закрываем.

urlConnection.connect();
if(urlConnection.getResponseCode()== HttpsURLConnection.HTTP_OK) {
    // Здесь работаем с web узлом
}
urlConnection.disconnect();

Как и с любым другим сетевым соединением, все работы с HTTPS следует выполнять в отдельном потоке. Например, AsyncTask.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *