Вопрос или проблема
Мы хотим разработать приложение на Flutter для доставки сертификатов на устройства сотрудников.
Нам удалось создать API, совместимое с SCEP, на бэкенде нашего приложения. По существу, он принимает CSR и возвращает PEM-сертификат на основе запроса. Создание CSR требует генерации пары ключей, и главная сложность заключается в том, что закрытый ключ никогда не должен быть доступен пользователю. Основные сценарии использования сертификата – это S/MIME (почтовое приложение на iOS и любые приложения на Android), авторизация IKEv2 для OpenVPN (считаю, что это невозможно на iOS) и Wi-Fi.
Таким образом, наша следующая проблема заключается в доставке на iOS, Android, Windows и macOS.
Настольные решения в этом отношении довольно просты, поэтому мы пропускаем этот пункт.
Apple MDM позволяет использовать SCEP-нагрузку для установки его в виде профиля настройки из кода, не требуя закрытого ключа, с которым была подписана CSR. Таким образом, мы можем довольно легко установить как CA, так и клиентские сертификаты.
Android, с другой стороны, всегда требует, чтобы закрытый ключ был упакован вместе с клиентским сертификатом и сертификатом CA. Это требует упаковки всего в контейнер PKCS12 и настройки жестко заданного пароля (или пароля, указанного пользователем, который, по сути, будет введен дважды). Также это нарушает правило “закрытый ключ недоступен конечному пользователю”.
Мы пробовали AMAPI, только чтобы обнаружить, что он не поддерживает распределение сертификатов по запросу (с использованием SCEP) и не включает сертификаты в профиль или политику настройки.
Это действительно лучшее решение для распределения сертификатов с использованием SCEP-сервера?
Ответ или решение
Установка сертификатов, полученных через SCEP, с использованием Flutter: детальный подход
В современном мире мобильные приложения играют важную роль в управлении корпоративными сертификатами. Сертификаты SCEP (Simple Certificate Enrollment Protocol) помогают в автоматизации процесса получения и установки сертификатов на устройствах. Этот процесс может оказаться сложным, особенно при работе с различными платформами, такими как iOS и Android. Рассмотрим, как организовать установку сертификатов, полученных через SCEP, с помощью Flutter, учитывая различные особенности каждой платформы.
Подготовка SCEP-совместимого API
Сначала важно убедиться, что ваш API правильно реализует SCEP. Он должен принимать запрос на CSR (Certificate Signing Request) и возвращать соответствующий PEM-сертификат. Убедитесь, что механизм безопасности обеспечивает ненадежный доступ к частным ключам. Сертификаты S/MIME, IKEv2 и Wi-Fi должны быть корректно поддержаны.
Установка сертификатов на iOS
Для установки сертификатов на устройствах Apple вы можете использовать возможность управления мобильными устройствами (MDM). MDM позволяет бесшовно устанавливать сертификаты через SCEP без необходимости доступа к частному ключу. Этапы установки:
- Создание SCEP-пейлоада: Пейлоад должен содержать инструкцию, указывающую, какой CSR отправить на ваш сервер.
- Отправка запроса на сервер: Система MDM автоматически управляет процессом отправки запроса на ваш SCEP-сервер после его регистрации.
- Получение и установка сертификата: Сертификаты будут автоматически установлены после успешного завершения процесса на сервере.
Эта схема идеальна, так как она не требует засекречивания частного ключа на устройстве.
Установка сертификатов на Android
Проблема с Android заключается в том, что устройства требуют наличия как сертификата, так и частного ключа, что противоречит концепции безопасности, которую вы хотите реализовать. Один из подходов к решению этой проблемы заключается в следующем:
- Упаковка сертификата в PKCS12: Это требует указания пароля, который может быть введён пользователем. Однако это значит, что частный ключ, потенциально, может быть доступен пользователю.
- Использование Flutter для упаковки: Существует несколько библиотек на Dart/Flutter, которые могут помочь создать PKCS12 файл (например,
asn1lib
иcryptography
).
Если использование PKCS12 невозможно, вам может потребоваться пересмотреть архитектуру и рассмотреть возможность управления сертификатами через бэкенд. Например, вы можете хранить частные ключи на сервере и предоставлять доступ к ним через защищенные API вызовы.
Установка сертификатов на Windows и macOS
Здесь вы упомянули, что уже нашли оптимальное решение. Однако для полноты картины учтите следующие рекомендации:
- Использование PowerShell на Windows для автоматизации установки сертификатов.
- Использование командной строки в macOS для установки через Keychain.
Заключение
SCEP предоставляет мощный инструмент для управления сертификатами, но реализация его через Flutter может потребовать дополнительных усилий, особенно для Android. Использование MDM на iOS является наиболее простым и безопасным процессом. Для Android рекомендуется пересмотреть использование PKCS12, так как это может привести к потенциальным уязвимостям. Важно оценить все доступные альтернативы и продумать архитектуру приложения с учетом особенностей каждой платформы.
Эффективное управление сертификатами требует комплексного подхода к безопасности и удобству использования для конечного пользователя.