Безопасно ли принимать самозаверяющие сертификаты?

У меня есть приложение для Android, и я продолжаю получать javax.net.ssl.SSLException: Not trusted server certificate, когда пытаюсь использовать его с моим собственным сервером с собственным самозаверяющим сертификатом.

Я собираюсь настроить Android TrustManager на принятие самозаверяющих сертификатов или принять все сертификаты, чтобы я мог отлаживать свое приложение. Я прочитал кучу ресурсов на этом сайте о том, как это сделать. Безопасно ли это делать?

Ответ 1

Нет, это не безопасно. Он разрушает большинство преимуществ безопасности SSL/TLS. Это открывает ваше приложение для атак man-in-the-middle. Принятие всех самоподписанных сертификатов почти так же плохо, как использование SSL вообще.

Не делай этого. Не изменяйте политику по умолчанию, чтобы принимать все сертификаты или все самозаверяющие сертификаты или отключать проверки проверки имени хоста.

Что делать вместо

Существует несколько альтернатив выбора, которые являются разумными.

Один разумный вариант - ввести параметр конфигурации для отладки разработчиков. Если этот параметр включен, вы можете отключить проверку сертификата; если он отключен, вы используете стандартные проверки проверки сертификата. По умолчанию он должен быть отключен. Кроме того, убедитесь, что этот параметр можно включить только на устройствах с включенными настройками разработчика и зарегистрированными в учетной записи разработчика Google, чтобы обычный пользователь не мог случайно покончить с собственной безопасностью.

Альтернативно, другой разумный вариант - добавить свой собственный самозаверяющий сертификат в хранилище сертификатов, чтобы ему было доверено. Android делает это немного более болезненным, чем необходимо; что вам нужно сделать, это реализовать свой собственный TrustManager, который ссылается на пользовательский TrustStore. Пользовательский TrustStore будет включать ваш самозаверяющий сертификат. Пользовательский TrustManager будет принимать сертификат, если он соответствует этому самозаверяющему сертификату, или если он проходит все обычные проверки проверки сертификата. Вы можете найти информацию о том, как это сделать на этом сообщении в блоге и этот учебник.

Любой из них позволит вам тестировать и отлаживать локально и гарантировать, что вы используете тот же код в тесте и в процессе производства. Это также позволит избежать риска небезопасного тестового кода, протекающего в процессе производства, и скомпрометировать безопасность ваших пользователей.

Могу ли я получить еще лучшую защиту?

Если ваше приложение написано для подключения к одному конкретному серверу, вы можете получить еще лучшую защиту, используя пин-код сертификата. В основном это означает, что вы будете принимать сертификаты, подписанные одним выбранным центром сертификации (CA), а не подписываться ни одним из десятков ЦС, которым доверяет Android. Вы можете найти информацию о том, как это сделать в этом учебнике, или используя Moxie Библиотека Marlinspike (читайте его введение здесь), или этот блог пост.

Однако это, возможно, вторично. Самое главное - отключить проверку стандартных сертификатов, приняв все сертификаты (или все самоподписанные сертификаты).

Это действительно большая сделка?

Это действительно имеет значение? Да, возможно, это так.

Исследования показали, что многие приложения имеют серьезную уязвимость в системе безопасности из-за отключения некоторых или всех проверок проверки сертификатов - возможно, затронуто 15% приложений. Во многих ситуациях, когда злоумышленник может подслушивать трафик SSL, они также могут монтировать атаку "человек в середине": например, если один из пользователей вашего приложения подключается через открытую сеть Wi-Fi, то любой в диапазоне может монтировать атаку "человек-в-середине" на этого пользователя (а не только подслушивать). Стоит избегать этой уязвимости.

Образец цитирования:

Ответ 2

Вы можете попросить TrustManager принять ваш собственный самозаверяющий сертификат. Здесь есть 2 метода, возвращающих соответственно DefaultHttpClient и HttpsURLConnection, принимающие в качестве параметров также самозаверяющий сертификат. Вы можете скопировать и пройти код или адаптировать часть TrustManager.

Ответ 3

Если вы думаете, что не используете доверительный менеджер по умолчанию, вы, вероятно, должны читать перед http://www.theregister.co.uk/2012/10/21/android_app_ssl_vulnerability/. Просто чтобы процитировать:

... обнаружил, что 17 процентов приложений, использующих SSL в своем образце, пострадали от реализаций, которые потенциально сделали их уязвимыми для атак типа "человек-в-середине" MITM.