Сбой сборки iOS EAS – “Сертификат распространения не был успешно импортирован”
Я разрабатываю приложение React Native с использованием Expo SDK 54. Сборка для Android работает идеально, и приложение корректно запускается на iPhone-устройствах через expo start --tunnel. Однако у меня возникла проблема при сборке для iOS через EAS для тестирования в TestFlight.
У меня нет аккаунта Apple Developer — у меня есть учетные данные от коллеги, который владеет таким аккаунтом:
- файл ключа .p8 (ключ API App Store Connect)
- ID ключа и ID издателя/разработчика
- Bundle ID
- профиль .mobileprovision
- сертификат распространения .p12 (создан в Windows с использованием OpenSSL)
Все учетные данные были загружены через credentials.json, и сборка начинается, но завершается с ошибкой:
“Сертификат распространения с отпечатком [XXXX] не был успешно импортирован”
Не может ли это быть вызвано:
- Несоответствием между профилем подготовки и сертификатом?
- Тем, что .p12 был создан в Windows вместо macOS с использованием KeyChain?
Какие шаги по устранению неполадок следует предпринять дальше? Стоит ли пересоздать файл .p12 на устройстве с macOS?
Сбои сборки iOS EAS из-за проблем с импортом сертификатов распространения
Сбои сборки iOS EAS из-за проблем с импортом сертификатов распространения обычно вызваны несоответствиями в профилях подготовки сертификатов, неправильным форматом сертификата или поврежденными файлами сертификатов. Ошибка “Сертификат распространения не был успешно импортирован” почти всегда указывает на то, что отпечаток сертификата в вашей конфигурации EAS не соответствует тому, что фактически находится в загруженном файле сертификата, или существует фундаментальная проблема с тем, как был создан или экспортирован сертификат.
Содержание
- Понимание ошибки импорта сертификата
- Распространенные причины сбоев импорта сертификатов
- Шаги по устранению неполадок с сертификатами iOS
- Создание правильных файлов .p12 на разных платформах
- Конфигурация EAS и управление учетными данными
- Продвинутые методы проверки
- Профилактические меры для будущих сборок
Понимание ошибки импорта сертификата
Сообщение об ошибке “Сертификат распространения с отпечатком [XXXX] не был успешно импортирован” - это конкретная ошибка сборки EAS, которая указывает на несоответствие между тем, что ожидает EAS, и тем, что он получает в процессе проверки сертификата. Эта ошибка обычно возникает на начальном этапе сборки, когда EAS пытается проверить ваши учетные данные распространения iOS.
При отправке сборки EAS выполняет несколько проверок:
- Проверяет формат и целостность сертификата
- Проверяет, соответствует ли сертификат профилю подготовки
- Проверяет соответствие отпечатка сертификата тому, что хранится в вашей конфигурации EAS
- Убеждается, что сертификат не отозван Apple
Отпечаток, указанный в ошибке, - это хеш SHA-1 открытого ключа вашего сертификата. Если этот отпечаток не соответствует тому, что ожидает EAS, или если сам сертификат имеет неправильный формат, вы получите эту ошибку.
Распространенные причины сбоев импорта сертификатов
Несоответствие сертификата и профиля подготовки
Наиболее распространенной причиной этой ошибки действительно является несоответствие между вашим сертификатом распространения и профилем подготовки. Когда ваш соавтор создавал эти учетные данные, он должен был:
- Сгенерировать сертификат распространения на своем Mac с помощью Keychain Access
- Создать профиль подготовки специально для этого сертификата
- Убедиться, что оба используют один и тот же App ID и идентификатор пакета
- Проверить, что сертификат не отозван и не истек
Если эти учетные данные были созданы в разное время или разными методами, они могут быть несовместимы.
Проблемы с сертификатами .p12, созданными в Windows
Создание сертификата .p12 в Windows с помощью OpenSSL вызывает серьезные проблемы для разработки iOS. Вот почему:
- Интеграция с цепочкой ключей: Сертификаты iOS предназначены для создания и управления через Keychain Access в macOS, который поддерживает правильные цепочки сертификатов и атрибуты
- Ограничения экспорта: OpenSSL экспортирует сертификаты без полной цепочки сертификатов, что требует Apple
- Различия в форматах: Сертификаты, созданные в Windows, часто не имеют необходимых расширений и атрибутов для распространения iOS
- Защита паролем: Обработка паролей может различаться между платформами, что приводит к повреждению
Поврежденные или неправильно отформатированные файлы сертификатов
Даже если создан в macOS, файл сертификата может быть поврежден при:
- Передаче между устройствами
- Отправке по электронной почте
- Сжатии/распаковке
- Проблемах с кодировкой текста
Шаги по устранению неполадок с сертификатами iOS
Шаг 1: Проверка отпечатков сертификатов
Сначала проверим, что ожидает EAS, и что у вас есть:
# Проверьте вашу конфигурацию EAS
eas build:configure
# Перечислите ваши учетные данные
eas credentials:list
Сравните отпечаток, указанный в ошибке, с фактическим отпечатком сертификата:
# В macOS (если у вас есть доступ)
openssl x509 -in your_certificate.p12 -noout -fingerprint -sha1
# В Windows (если необходимо использовать Windows)
openssl pkcs12 -in your_certificate.p12 -nodes -passin pass:your_password | openssl x509 -noout -fingerprint -sha1
Шаг 2: Проверка соответствия сертификата и профиля подготовки
Проверьте, соответствует ли ваш профиль подготовки вашему сертификату:
- Установите файл .mobileprovision на Mac с Xcode
- Откройте его в Xcode → Organizer → Devices
- Убедитесь, что он связан с правильным сертификатом распространения
- Проверьте, что App ID/идентификатор пакета соответствует вашему приложению
Шаг 3: Тестирование с прямой сборкой в Xcode
Прежде чем снова пытаться использовать EAS, протестируйте ваши учетные данные с прямой сборкой в Xcode:
- Установите .p12 и .mobileprovision на Mac
- Создайте простой проект iOS в Xcode
- Настройте проект с вашим идентификатором пакета
- Попробуйте заархивировать и экспортировать
Если это не сработает, у ваших учетных данных есть фундаментальные проблемы независимо от EAS.
Шаг 4: Очистка и повторная загрузка учетных данных
Иногда EAS путается с кэшированными данными учетных данных:
# Удалите существующие учетные данные
eas credentials:remove
# Повторно загрузите свежие учетные данные
eas credentials:import --path credentials.json
Создание правильных файлов .p12 на разных платформах
Метод macOS (рекомендуется)
Единственный надежный способ создания сертификатов распространения iOS - на Mac с правильным доступом к аккаунту Apple Developer:
- Откройте Keychain Access на Mac вашего соавтора
- Перейдите в Keychain Access → Certificate Assistant → Request a Certificate from a Certificate Authority
- Заполните свой email и выберите “Saved to disk”
- После утверждения экспортируйте сертификат как файл .p12 из Keychain Access
- Используйте параметры экспорта по умолчанию в Keychain Access (включить закрытый ключ, использовать надежный пароль)
Альтернатива для Windows (не рекомендуется)
Если абсолютно необходимо использовать Windows:
- Установите OpenSSL для Windows
- Используйте эти точные команды:
# Конвертируйте сертификат в формат PEM
openssl pkcs12 -in certificate.p12 -out certificate.pem -nodes -passin pass:your_password
# Создайте новый PKCS12 с правильными заголовками
openssl pkcs12 -export -out certificate_fixed.p12 -inkey certificate.pem -in certificate.pem -password pass:your_new_password
- Тщательно протестируйте перед использованием с EAS
Скрипт проверки сертификата
Создайте этот скрипт для проверки вашего сертификата перед загрузкой:
#!/bin/bash
# certificate_check.sh
CERT_FILE="$1"
PASSWORD="$2"
echo "Проверка формата сертификата..."
openssl pkcs12 -in "$CERT_FILE" -passin pass:"$PASSWORD" -nokeys -out /tmp/cert.pem
echo "Детали сертификата:"
openssl x509 -in /tmp/cert.pem -text -noout | grep -E "(Subject:|Issuer:|X509v3 Key Usage:|X509v3 Extended Key Usage:)"
echo "Отпечаток сертификата:"
openssl x509 -in /tmp/cert.pem -noout -fingerprint -sha1
echo "Проверка цепочки сертификата..."
openssl verify -CAfile /tmp/cert.pem /tmp/cert.pem
Конфигурация EAS и управление учетными данными
Правильная структура credentials.json
Убедитесь, что ваш credentials.json следует этой точной структуре:
{
"ios": {
"distributionCertificate": {
"filename": "distribution.p12",
"password": "your_certificate_password",
"id": "your_certificate_id",
"teamId": "your_team_id"
},
"provisioningProfile": {
"filename": "profile.mobileprovision",
"id": "your_profile_id"
}
}
}
Учетные данные для разных сред
Рассмотрите возможность использования разных учетных данных для разработки и распространения:
# Для сборок разработки
eas build --platform ios --profile development
# Для сборок распространения
eas build --platform ios --profile distribution
Стратегия ротации учетных данных
Сертификаты Apple истекают ежегодно. Реализуйте стратегию ротации:
- За 60 дней до истечения срока: Уведомить команду
- За 30 дней до истечения срока: Сгенерировать новые сертификаты
- За 7 дней до истечения срока: Протестировать новые учетные данные
- В день истечения срока: Переключиться на новые учетные данные
Продвинутые методы проверки
Проверка цепочки сертификата
Проверьте, что у вашего сертификата есть правильная цепочка:
# Проверка цепочки сертификата
openssl x509 -in your_cert.p12 -noout -text | grep -A 10 "Authority Information Access"
Ищите корневые сертификаты Apple в цепочке.
Анализ профиля подготовки
Глубокое погружение в ваш профиль подготовки:
# Извлечение деталей профиля
security cms -D -i profile.mobileprovision > profile.plist
# Проверка содержимого профиля
cat profile.plist | grep -E "(application-identifier|provisioned-profiles|entitlements)"
Анализ журнала сборки EAS
Изучите полный журнал сборки EAS для получения более подробной информации об ошибке:
eas build --platform ios --local --log-format raw
Ищите конкретные коды ошибок и временные метки вокруг шага проверки сертификата.
Профилактические меры для будущих сборок
Мониторинг сертификатов в автоматическом режиме
Настройте мониторинг истечения срока действия сертификатов:
#!/bin/bash
# check_cert_expiration.sh
openssl x509 -in cert.p12 -noout -enddate | cut -d= -f2
Запускайте этот скрипт еженедельно и отправляйте уведомления, если срок истекает в течение 60 дней.
Централизованное управление учетными данными
Рассмотрите использование системы безопасного управления учетными данными:
- HashiCorp Vault
- AWS Secrets Manager
- GitHub Secrets (для небольших команд)
Стандартизация среды сборки
Стандартизируйте процесс сборки:
- Используйте конвейеры CI/CD на основе macOS
- Реализуйте скрипты подписи сертификатов
- Поддерживайте документацию по процедурам с учетными данными
Регулярный аудит учетных данных
Проводите ежеквартальный аудит:
- Действительности сертификатов
- Соответствия сертификатов профилям
- Разрешений доступа для членов команды
- Безопасности хранения учетных данных
Источники
- Документация Expo EAS Build - Конфигурация iOS
- Документация Apple Developer - Создание сертификатов распространения
- Руководство по управлению сертификатами OpenSSL
- Лучшие практики сборки React Native iOS
- Руководство по устранению неполадок EAS - Проблемы с сертификатами
Заключение
Ошибка “Сертификат распространения не был успешно импортирован” в большинстве случаев вызвана либо несоответствием сертификата и профиля подготовки, либо файлом .p12, созданным в Windows, который не имеет необходимых атрибутов сертификата iOS. Настоятельно рекомендуется пересоздать файл .p12 на устройстве macOS с помощью Keychain Access, так как метод OpenSSL в Windows часто создает сертификаты, которые отклоняются системами Apple.
Начните с проверки отпечатков сертификатов и тестирования с прямыми сборками в Xcode перед повторной попыткой использования EAS. Реализуйте правильные практики управления учетными данными для предотвращения подобных проблем в будущем и всегда используйте macOS для создания и управления сертификатами iOS. Если ваш соавтор может пересоздать учетные данные на своем Mac, это, скорее всего, сразу решит проблему.