Ответ 1
Нет, это не безопасно. Он разрушает большинство преимуществ безопасности SSL/TLS. Это открывает ваше приложение для атак man-in-the-middle. Принятие всех самоподписанных сертификатов почти так же плохо, как использование SSL вообще.
Не делай этого. Не изменяйте политику по умолчанию, чтобы принимать все сертификаты или все самозаверяющие сертификаты или отключать проверки проверки имени хоста.
Что делать вместо
Существует несколько альтернатив выбора, которые являются разумными.
Один разумный вариант - ввести параметр конфигурации для отладки разработчиков. Если этот параметр включен, вы можете отключить проверку сертификата; если он отключен, вы используете стандартные проверки проверки сертификата. По умолчанию он должен быть отключен. Кроме того, убедитесь, что этот параметр можно включить только на устройствах с включенными настройками разработчика и зарегистрированными в учетной записи разработчика Google, чтобы обычный пользователь не мог случайно покончить с собственной безопасностью.
Альтернативно, другой разумный вариант - добавить свой собственный самозаверяющий сертификат в хранилище сертификатов, чтобы ему было доверено. Android делает это немного более болезненным, чем необходимо; что вам нужно сделать, это реализовать свой собственный TrustManager
, который ссылается на пользовательский TrustStore
. Пользовательский TrustStore
будет включать ваш самозаверяющий сертификат. Пользовательский TrustManager
будет принимать сертификат, если он соответствует этому самозаверяющему сертификату, или если он проходит все обычные проверки проверки сертификата. Вы можете найти информацию о том, как это сделать на этом сообщении в блоге и этот учебник.
Любой из них позволит вам тестировать и отлаживать локально и гарантировать, что вы используете тот же код в тесте и в процессе производства. Это также позволит избежать риска небезопасного тестового кода, протекающего в процессе производства, и скомпрометировать безопасность ваших пользователей.
Могу ли я получить еще лучшую защиту?
Если ваше приложение написано для подключения к одному конкретному серверу, вы можете получить еще лучшую защиту, используя пин-код сертификата. В основном это означает, что вы будете принимать сертификаты, подписанные одним выбранным центром сертификации (CA), а не подписываться ни одним из десятков ЦС, которым доверяет Android. Вы можете найти информацию о том, как это сделать в этом учебнике, или используя Moxie Библиотека Marlinspike (читайте его введение здесь), или этот блог пост.
Однако это, возможно, вторично. Самое главное - отключить проверку стандартных сертификатов, приняв все сертификаты (или все самоподписанные сертификаты).
Это действительно большая сделка?
Это действительно имеет значение? Да, возможно, это так.
Исследования показали, что многие приложения имеют серьезную уязвимость в системе безопасности из-за отключения некоторых или всех проверок проверки сертификатов - возможно, затронуто 15% приложений. Во многих ситуациях, когда злоумышленник может подслушивать трафик SSL, они также могут монтировать атаку "человек в середине": например, если один из пользователей вашего приложения подключается через открытую сеть Wi-Fi, то любой в диапазоне может монтировать атаку "человек-в-середине" на этого пользователя (а не только подслушивать). Стоит избегать этой уязвимости.
Образец цитирования:
- Переосмысление разработки SSL в объявленном мире. Саша Фахл, Мариан Харбах, Хеннинг Перл, Маркус Кёттер и Мэтью Смит. ACM CCS 2013. См. Также http://android-ssl.org/.