2012-03-18 2 views
22

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

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

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

+0

Что вы подразумеваете под "просто использовать обычный доверенный сертификат"? Это то, что вы делаете, не так ли? – EJP

+0

Я изменил вопрос. Скажи мне, если это более ясно. –

+0

Гораздо лучше. См. Мой ответ. – EJP

ответ

10

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

+0

* «Мне кажется, вам нужен какой-то шаг регистрации после установки ...» * - Также см. [Simple Certificate Enrollment Protocol (SCEP)] (https://tools.ietf.org/html/draft-gutmann-scep). Его широко принятый, но он никогда не был стандартизирован. Питер Гутманн недавно взял факел от Cisco и пытается стандартизировать его. – jww

+0

* «У любого, у кого есть приложение, есть ключ, поэтому он не предоставляет вам никакой безопасности ...» * - это настоящая проблема. Это называется проблемой * «Автоматическое хранение ключей» *. Его злая проблема. Также см. Книгу [Инженерная безопасность] Гутмана (http://www.cs.auckland.ac.nz/~pgut001/pubs/book.pdf). – jww

12

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

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

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

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

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

1

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

+1

iOS не позволяет читать IMEI. –

9

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

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

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

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

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

+6

Просто заметьте: если пользователь является злоумышленником, запрос пароля не решает проблему. –

+0

100% правильный. :) – jeffsix

+0

* закрытый ключ * зашифрован, а не сертификат. В случае утечки сертификата не возникает риска, если только закрытый ключ не протекает. – EJP

4

Daniel Guillamot, некоторые трюки я перешедшие:

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

+0

Ответ Даниэля на самом деле не был ответом, скорее комментарием, так и вашим до некоторой степени ... – Bruno

Смежные вопросы