Подтвердить что ты не робот

Насколько безопасны SSL-сертификаты клиентов в мобильном приложении?

Я хотел бы иметь безопасную связь между моим Android/iOS-приложением и моим интернет-доступным бэкэнд-сервисом, поэтому я изучаю HTTPS/SSL.

Если я создаю самозаверяющие сертификаты, а затем поставлю сертификат клиента в приложение и заставим серверную службу требовать сертификат клиента, это действительно безопасно?

Вот почему я спрашиваю. Кажется, что клиентский сертификат можно "взломать", опросив .apk. Сертификат клиента - это просто строковая константа, не так ли? Это означает, что любой пользователь может использовать сертификат клиента для доступа к моему серверу. Является ли эквивалент .apk(и iOS) достаточно непрозрачным для предотвращения обнаружения сертификата клиента?

4b9b3361

Ответ 1

Сертификат безвреден. Это секретный ключ, который нуждается в защите, и он безопасен только как само устройство, не безопаснее. Распространение сертификата и закрытого ключа с помощью приложения означает, что любой, у кого есть приложение, имеет ключ, поэтому он не предоставляет вам никакой безопасности. Я думаю, вам нужен какой-то шаг регистрации после установки.

Ответ 2

Выполняете ли вы проверку подлинности на стороне клиента сертификатами через SSL? Не то, чтобы это действительно имело значение для этого вопроса. Любые закрытые ключи, которые вы храните в своем приложении, доступны злоумышленнику. Каждый клиент должен иметь собственный сертификат и пару ключей, чтобы предотвратить массовый компромисс. Ваш сервер также должен обеспечивать защиту, гарантируя, что скомпрометированный клиент не может просто запросить что-либо.

Это верно для любой схемы аутентификации. Если вы вставляете пароли, ключи API, ключи дешифрования, что угодно. Все, что на устройстве должно считаться доступным.

Добавленная защита от сертификатов частично возникает из-за отсутствия грубой силы. Если вы отправили маршрут имени пользователя и пароля для каждого клиента, можно догадаться о паролях. То же самое с ключами API (хотя они длиннее и сложнее). С сертификатами это совершенно другой класс атак и значительно более сложная проблема.

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

Теперь, имея дело с сертификатами, у вас будет целый ряд других проблем. Вероятно, вы захотите подписать каждый сертификат клиента с помощью собственного сертификата CA. Управление сертификатом CA может быть проблематичным, в зависимости от вашего варианта использования. Собираетесь ли вы генерировать эти сертификаты клиентов "на лету" или вручную? Смысл, это приложение, которое может загрузить миллион человек, и вам нужна автоматическая система для их создания? Или это частное/внутреннее приложение, которое вы лично будете обрабатывать для создания сертификатов?

Ответ 3

Обычно клиентские SSL-сертификаты хранятся в хранилищах ключей (BKS, отформатированных в случае Android), и хранилище ключей включено как ресурс в вашем APK. Хранилища шифруются и защищены паролем. Таким образом, этот клиентский сертификат не может быть легко извлечен из APK, поскольку он хранится в зашифрованном виде.

Теперь... что вы делаете с паролем? Вот суть дела, и у вас есть две альтернативы.

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

Ваша альтернатива заключается в том, чтобы предлагать пользователю пароль каждый раз, когда ваше приложение взаимодействует с сервером и использует его для дешифрования хранилища ключей (или спрашивает, когда приложение запускается и кеширует сертификат на определенное время). Преимущество в том, что если кто-то обратит инженеров ваш APK, они найдут зашифрованное хранилище ключей и пароль, чтобы ваш сертификат был безопасным. Недостатком является предоставление пользователем пароля.

Какой подход лучше всего? Это полностью зависит от чувствительности данных, которые вы касаетесь, и от уровня риска, который вы готовы принять. Только вы можете ответить на этот вопрос.

Ответ 4

Даниэль Гилламот, некоторые трюки, которые я придумал:

Мне бы хотелось услышать больше, если у кого-нибудь есть другие идеи.

Ответ 5

APK можно получить доступ и скопировать, поэтому помещать что-либо в него не поможет. Необходима активация и, возможно, привязка сертификата к устройству после установки. Связывание может быть выполнено, например, путем помещения IMEI устройства в один из расширений сертификата и передачи IMEI вместе с сертификатом вашим приложением (или, лучше, передать IMEI после аутентификации и установить безопасный канал).