Как подписать iOS-приложение своим сертификатом

Ошибка «No signing certificate found» или предупреждение Xcode о недействительном профиле — типичная ситуация, с которой сталкивается разработчик при первой попытке подписать iOS-приложение своим сертификатом. Причина чаще всего кроется в несоответствии между сертификатом в связке ключей, идентификатором приложения (Bundle ID) и provisioning-профилем, привязанным к вашему аккаунту разработчика.

Разберём весь процесс по шагам: от создания сертификата до проверки подписи готового файла. Материал подойдёт как тем, кто работает через Xcode, так и тем, кто подписывает IPA-файлы вручную с помощью командной строки.

Что такое подпись кода и зачем она нужна

Apple не позволяет установить на iPhone или iPad приложение без действительной цифровой подписи. Подпись кода подтверждает, что сборка создана конкретным разработчиком и не была изменена после подписания. Система проверяет подпись при установке и при каждом запуске приложения.

Механизм подписи состоит из трёх связанных компонентов: сертификата разработчика (выдаётся через аккаунт Apple Developer), закрытого ключа (хранится в связке ключей macOS) и provisioning-профиля, который связывает сертификат с конкретным Bundle ID и списком устройств. Если хотя бы один элемент отсутствует или не совпадает с остальными, подпись не пройдёт.

Типы сертификатов Apple

Прежде чем подписывать приложение, определите, какой тип сертификата вам нужен. Они различаются назначением и сроком действия.

Тип сертификатаНазначениеТребования
Apple DevelopmentОтладка и установка на свои устройстваБесплатный или платный аккаунт разработчика
Apple DistributionПубликация в App Store и распространение через TestFlight / Ad HocПлатная программа Apple Developer
Enterprise (In-House)Внутреннее распространение в организацииApple Developer Enterprise Program
Бесплатный профиль (Personal Team)Тестирование на собственном устройствеОбычный Apple ID, срок действия подписи ограничен

Для публикации в App Store подходит только Apple Distribution. Для разработки и отладки достаточно сертификата Apple Development, который Xcode может создать автоматически.

Создание сертификата через Xcode

Самый простой способ — доверить Xcode автоматическое управление подписью. Среда сама запросит сертификат у Apple и создаст provisioning-профиль.

  • 🔑 Откройте Xcode → Settings → Accounts и добавьте свой Apple ID.
  • 📱 Выберите проект, перейдите в Signing & Capabilities и включите Automatically manage signing.
  • 👤 В поле Team выберите свою команду разработчика.
  • 🆔 Убедитесь, что Bundle Identifier уникален — дубликаты чужих идентификаторов вызовут ошибку.

Если автоматический режим недоступен или нужен ручной контроль, сертификат создаётся через портал разработчика. Сначала сгенерируйте запрос на подпись: откройте Связку ключей и выберите Связка ключей → Ассистент сертификации → Запросить сертификат у центра сертификации. Сохраните файл .certSigningRequest и загрузите его в разделе Certificates, Identifiers & Profiles на сайте developer.apple.com.

⚠️ Внимание: закрытый ключ сертификата существует только на том Mac, где был создан запрос. При смене компьютера экспортируйте сертификат вместе с ключом в файл .p12, иначе подписывать сборки на новой машине не получится.
📊 Как вы подписываете свои iOS-приложения?
Автоматически через Xcode
Вручную через портал разработчика
Через fastlane / CI
Ещё только разбираюсь

Настройка provisioning-профиля

Профиль связывает сертификат, Bundle ID и (для development и Ad Hoc) список UDID устройств. Создаётся он там же — на портале разработчика в разделе Profiles.

Порядок действий: выберите тип профиля (Development, Ad Hoc или App Store), укажите App ID, отметьте нужные сертификаты и устройства, затем скачайте файл .mobileprovision. Двойной клик по файлу установит его в систему, и Xcode подхватит профиль автоматически.

Для Ad Hoc и Development-профилей UDID устройства обязательно должен быть добавлен в профиль до подписи — иначе приложение просто не установится на этот iPhone. Узнать UDID можно через Finder при подключении устройства к Mac или через сам Xcode в окне Devices and Simulators.

☑️ Проверка готовности к подписи

Выполнено: 0 / 5

Подпись IPA-файла вручную через терминал

Иногда требуется переподписать уже собранный .ipa — например, при передаче сборки между командами. Для этого используется утилита codesign, входящая в состав инструментов командной строки Xcode.

Сначала распакуйте архив, затем подпишите вложенные фреймворки и сам бинарник, указав сертификат и профиль:

unzip MyApp.ipa

codesign -f -s "Apple Distribution: Имя (TEAMID)" --entitlements entitlements.plist Payload/MyApp.app

zip -qr MyApp-signed.ipa Payload

Файл entitlements.plist можно извлечь из исходного приложения командой codesign -d --entitlements. После подписи обязательно проверьте результат: команда codesign -vv Payload/MyApp.app должна завершиться без ошибок.

Типичные ошибки и их решение

Большинство проблем с подписью сводится к нескольким повторяющимся сценариям.

  • «No matching provisioning profiles found» — профиль не установлен или его Bundle ID не совпадает с проектом. Скачайте профиль заново и проверьте идентификатор.
  • 🔒 «The certificate has been revoked» — сертификат отозван на портале или кем-то из команды. Создайте новый.
  • Просроченный профиль — development-профили имеют ограниченный срок действия, обновите их на портале.
  • 📵 «Untrusted Developer» на устройстве — откройте Настройки → Основные → VPN и управление устройством и подтвердите доверие разработчику.
⚠️ Внимание: отзыв distribution-сертификата затронет все сборки, подписанные им. Перед отзывом убедитесь, что у команды есть новый сертификат и обновлённые профили, иначе CI-сборки и выгрузка в App Store остановятся.
Что делать, если Xcode не видит сертификат

Откройте Связку ключей и проверьте, что сертификат находится в связке «Вход» (login), а не в «Системе», и что рядом с ним отображается закрытый ключ. Если ключа нет — сертификат бесполезен для подписи, нужно импортировать .p12 с исходной машины или создать сертификат заново. Также помогает перезапуск Xcode и повторный вход в аккаунт в разделе Settings → Accounts.

Автоматизация подписи через fastlane

В командах с CI/CD подписью обычно управляет fastlane и его инструмент match. Он хранит сертификаты и профили в зашифрованном git-репозитории и синхронизирует их между машинами разработчиков и сборочными агентами.

fastlane match development

fastlane match appstore

Такой подход избавляет от ситуации, когда у каждого разработчика свой сертификат и профили конфликтуют. Однако настройка требует аккуратности с доступами к репозиторию — в нём фактически лежат ключи от вашего аккаунта распространения.

Часто задаваемые вопросы

Можно ли подписать приложение без платного аккаунта Apple Developer?

Да, с помощью бесплатного Apple ID через режим Personal Team в Xcode. Такая подпись позволяет установить приложение только на свои устройства, а её срок действия ограничен — приложение перестанет запускаться, и подпись придётся обновлять. Для публикации в App Store платная программа обязательна.

Чем отличается Development-сертификат от Distribution?

Development-сертификат предназначен для отладки: приложение устанавливается только на устройства, чьи UDID внесены в профиль. Distribution-сертификат используется для App Store, TestFlight и Ad Hoc-распространения.

Что делать, если потерян закрытый ключ сертификата?

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

Почему приложение подписано, но не устанавливается на iPhone?

Наиболее вероятные причины: UDID устройства не добавлен в профиль, профиль просрочен, либо пользователь не подтвердил доверие разработчику в настройках устройства. Проверьте также, что тип профиля соответствует способу установки.

Можно ли переподписать чужое IPA-приложение своим сертификатом?

Технически codesign позволяет переподписать любой распакованный IPA, однако модификация и переподпись чужих приложений может нарушать условия лицензии и правила Apple. Используйте этот метод только для собственных сборок или с явного разрешения правообладателя.