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

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

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

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

5 ответов


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


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

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

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

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

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


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

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

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

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

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


Даниил Guillamot, некоторые трюки я:

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


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