Ошибка «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, иначе подписывать сборки на новой машине не получится.
Настройка 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.
☑️ Проверка готовности к подписи
Подпись 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. Используйте этот метод только для собственных сборок или с явного разрешения правообладателя.