Насколько безопасны клиентские SSL-сертификаты в мобильном приложении? - PullRequest
24 голосов
/ 19 марта 2012

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

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

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

Ответы [ 5 ]

13 голосов
/ 19 марта 2012

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

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

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

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

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

11 голосов
/ 19 марта 2012

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

10 голосов
/ 19 марта 2012

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

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

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

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

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

4 голосов
/ 29 марта 2012

Даниэль Гийомот, некоторые хитрости, с которыми я столкнулся:

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

1 голос
/ 19 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...