# Push-сертификат Apple: .p8 или .p12 в Expo

> Для push-уведомлений Apple даёт бессрочный ключ .p8 для всех твоих приложений или годовой сертификат .p12. В Expo ключом управляет EAS.

Оригинальная страница: [Push-сертификат Apple: .p8 или .p12 в Expo](https://devoria.fr/ru/blog/apple-push-certificate-p8-p12-expo)
Автор: [Mehdi Azizi](https://devoria.fr/ru/mehdi-azizi)
Опубликовано: 2026-11-04
Последняя правка контента: 2026-11-04


Push-сертификат Apple разрешает серверу отправлять уведомления в твоё приложение через APNs, сервис уведомлений Apple. Он бывает в двух видах: сертификат .p12, который действует год и привязан к одному приложению, или ключ .p8, который не истекает и подходит для всех приложений твоего аккаунта. **С Expo сертификат тебе не нужен: EAS предлагает создать ключ .p8 при первой сборке, и push-сервис Expo использует его за тебя.**

В гайде про [сертификат разработчика и provisioning profile](https://devoria.fr/ru/blog/ios-developer-certificate-provisioning-profile-expo) push-ключ упоминается в паре строк. Здесь разберём всё до конца: выбор между двумя форматами, окружения sandbox и production, продление и сбои, из-за которых уведомления не доходят в TestFlight.

Я публикую свои приложения через Expo и EAS. В конфигурации Solys и TradaZen объявлен плагин `expo-notifications`: именно он готовит приложение к приёму уведомлений.

## Зачем Apple нужен сертификат или ключ

Push-уведомление уходит с сервера, твоего или сервера Expo, тот передаёт его в APNs, а APNs доставляет его на iPhone. Значит, APNs должен проверить, что этот сервер имеет право писать твоему приложению. Apple предлагает два способа это доказать.

- **Подключение по токену, с ключом .p8.** [По словам Apple](https://developer.apple.com/documentation/usernotifications/establishing-a-token-based-connection-to-apns), оно быстрее, работает с нескольких серверов, а один ключ покрывает все приложения твоей команды или их часть. Сервер подписывает им токен, который нужно обновлять минимум раз в час.
- **Подключение по сертификату, с файлом .p12.** [Apple уточняет](https://developer.apple.com/documentation/usernotifications/establishing-a-certificate-based-connection-to-apns), что такой сертификат привязан к одному приложению и действует год. Несколько приложений означают несколько сертификатов.

[Страница Apple о сроках действия](https://developer.apple.com/support/expiration/) напоминает: ключ подписи токенов APNs не истекает никогда.

## Таблица .p8 / .p12

| Критерий             | Ключ .p8                    | Сертификат .p12         |
| -------------------- | --------------------------- | ----------------------- |
| Срок действия        | Не истекает                 | Один год                |
| Охват                | Все твои приложения         | Одно приложение         |
| Окружение            | Выбирается при создании     | Sandbox и production    |
| Продление            | Не нужно, кроме отзыва      | Каждый год              |
| Скачивание           | Только один раз             | Экспорт с Mac           |
| Количество           | Два на окружение            | Один на приложение      |
| Использование в Expo | Создаётся и управляется EAS | Нет в документации Expo |

Три уточнения. Файл .p8 [скачивается только один раз](https://developer.apple.com/help/account/keys/create-a-private-key): Apple не хранит его в твоём аккаунте. А .p12 [экспортируется из связки ключей Mac](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-a-tls-certificate), на котором создан сертификат. И лимит в два ключа на окружение касается ключей команды. Для ключей, ограниченных отдельными приложениями, Apple разрешает до 200 на окружение.

[Страница Expo об учётных данных](https://docs.expo.dev/app-signing/app-credentials/) говорит только о push-ключе и допускает максимум два на аккаунт, не различая ни окружения, ни ключи для отдельных приложений. **Для приложения на Expo правильный выбор: ключ .p8.**

## Sandbox и production: два окружения

У APNs два сервера: development, он же sandbox, и production. [Apple](https://developer.apple.com/documentation/usernotifications/sending-notification-requests-to-apns) отводит первый для тестов, а второй для опубликованных приложений. Приложение узнаёт, какой использовать, по entitlement `aps-environment`. [По словам Apple](https://developer.apple.com/documentation/bundleresources/entitlements/aps-environment), его значение зависит от профиля подписи: `development` с профилем разработки, `production` с профилем дистрибуции и для TestFlight.

**Поэтому сборка TestFlight общается с production, точно так же, как App Store.**

Со стороны Expo две детали. [Документация expo-notifications](https://docs.expo.dev/versions/latest/sdk/notifications/) говорит, что в проекте entitlement всегда прописан как `development`, а в архиве release-сборки переключается на `production`. И при создании токен Expo привязывается к окружению приложения, которое определяется автоматически: при отправке тебе ничего выбирать не нужно.

Если создаёшь ключ сам, Apple спросит его окружение и охват: вся команда или отдельные приложения. В документации для разработчиков теперь описаны ключи команды, ограниченные sandbox или production, а старые ключи, действующие везде, по-прежнему принимаются. А вот [справка по аккаунту](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-authentication-tokens) всё ещё утверждает, что ключ работает в обоих окружениях. Apple сам себе противоречит: ориентируйся на окружение, которое выбрал при создании. **Ключ только для sandbox не подойдёт ни для TestFlight, ни для App Store.**

## Как Expo управляет push-ключом

Согласно [гайду Expo по настройке](https://docs.expo.dev/push-notifications/push-notifications-setup/), обновлённому 28 июля 2026 года, первая development-сборка предложит настроить push-уведомления и сгенерировать ключ APNs. Отвечай «да» на оба вопроса. Без EAS Build запусти `eas credentials`. Нужен платный аккаунт Apple Developer.

Дальше:

- **EAS хранит ключ и привязывает его к приложению.** По словам Expo, один ключ подходит для любого числа приложений, а загрузка нового не меняет токены Expo Push твоих пользователей.
- **Твой сервер не обращается к APNs.** Он отправляет в push-сервис Expo, а тот передаёт в APNs. [Expo просит читать квитанции](https://docs.expo.dev/push-notifications/sending-notifications/) примерно через 15 минут после отправки: именно там видны ошибки.
- **Плагин добавляет entitlement.** Объяви `expo-notifications` в `plugins`:

```json
{
  "expo": {
    "plugins": ["expo-notifications"]
  }
}
```

Две ловушки. [FAQ Expo](https://docs.expo.dev/push-notifications/faq/) говорит, что Expo Go не поддерживает push-уведомления начиная с SDK 53, а страница expo-notifications упоминает только Android. В обоих случаях Expo советует development-сборку: тестируй на ней. И удаление ключа через `eas credentials` убирает его с серверов Expo, но не из твоего аккаунта Apple. Чтобы освободить место, отзови ключ в портале Apple. Как и любой секрет, файл .p8 никогда не должен попасть в репозиторий: правило то же, что и для [API-ключей приложения на Expo](https://devoria.fr/ru/blog/sekretnyj-api-klyuch-expo-prilozhenie).

## Продление: что на самом деле истекает

**Ключ .p8 продлевать не нужно.** Он перестаёт работать, только если ты его отзовёшь. Если подозреваешь, что он скомпрометирован, [Apple советует](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-authentication-tokens) создать новый ключ, переключиться на него и только потом отозвать старый. Как заменить ключ в Expo, описано в FAQ: `eas credentials`, iOS, твой профиль сборки, затем удаление push-ключа и генерация нового.

**Сертификат .p12 истекает каждый год.** Apple просит обновить его до окончания срока и следить за датой в связке ключей. После истечения или отзыва [ты больше не сможешь отправлять уведомления](https://developer.apple.com/help/account/certificates/certificates-overview) в своё приложение. Отдельной процедуры продления Apple не описывает: создаёшь новый сертификат из идентификатора приложения, ставишь его на сервер до окончания срока, потом удаляешь старый. **Лучшее продление: перейти на ключ.**

> Управляешь iPhone через Intune или другую систему управления устройствами? Это другой сертификат. Push-сертификат для управления устройствами создаётся на Apple Push Certificates Portal и продлевается каждый год. [Apple советует](https://support.apple.com/guide/deployment/dep2de55389a) записать использованный Apple-аккаунт: он понадобится для продления.

## Типичные сбои и как их исправить

### В development работает, в TestFlight нет

1. **Ты отправляешь не на тот токен.** Сборка TestFlight регистрируется в production и получает новый токен. Токен из development-сборки не сработает: Apple отвечает `BadDeviceToken`, когда [токен не соответствует окружению](https://developer.apple.com/documentation/usernotifications/handling-notification-responses-from-apns). Бери токен из самого приложения в TestFlight.
2. **У production-приложения нет push-учётных данных.** Это диагноз из FAQ Expo. Проверь страницу учётных данных проекта на expo.dev или `eas credentials`.
3. **Твой ключ ограничен sandbox.** Замени его ключом, который работает в production.
4. **iPhone не получает токен.** Если ты установил сборку TestFlight поверх сборки из Xcode, Expo советует перезагрузить устройство.

### «No valid aps-environment entitlement string found»

По FAQ Expo, эта ошибка означает, что для твоего iOS-проекта не настроен push-ключ. Проверь страницу учётных данных и запусти сборку заново: EAS предложит сгенерировать ключ. Ещё проверь, что `expo-notifications` указан в `plugins`.

### ITMS-90078: Missing Push Notification Entitlement

Apple присылает это письмо после отправки сборки: похоже, приложение регистрируется в APNs, но в его подписи нет entitlement `aps-environment`. Это объясняет [заметка Expo о SDK 51](https://github.com/expo/fyi/blob/main/apns-entitlement-sdk-51.md). Начиная с этого SDK, entitlement добавляется, только если установлен `expo-notifications`. Предупреждение возникает из-за двух проверок Apple. Первая сравнивает capabilities идентификатора приложения с entitlements приложения. Вторая находит в бинарнике метод регистрации уведомлений, который есть в коде Expo во всех приложениях.

**Это предупреждение, а не отказ**, уточняет Expo. Если ты используешь уведомления, добавь плагин и пересобери: [EAS синхронизирует capabilities](https://docs.expo.dev/build-reference/ios-capabilities/) идентификатора приложения при каждой сборке. Если нет, убери capability Push Notifications у идентификатора в портале Apple. Предупреждение может остаться, но ни на что не повлияет.

### InvalidCredentials или все приложения замолчали разом

`InvalidCredentials` в квитанции значит, что твои push-учётные данные больше не действительны, часто потому, что ключ отозван. Все приложения, которые его использовали, замолкают одновременно. Решение от Expo: `eas credentials`, затем новый ключ. Если в квитанции `InvalidProviderToken`, Expo советует пересобрать, заново сгенерировав push-ключ и профиль.

## Перед включением уведомлений

Чтобы протестировать уведомления на своём iPhone до релиза, следуй гайду [TestFlight для тестирования приложения](https://devoria.fr/ru/blog/testflight-testirovanie-iphone-prilozheniya). Если отправляешь тихие уведомления, чтобы будить приложение, перечитай [guideline 2.5.4 о фоновых режимах](https://devoria.fr/ru/blog/guideline-2-5-4-background-mode-rejected). Вся цепочка без Mac описана в статье [как опубликовать iOS-приложение без Mac](https://devoria.fr/ru/blog/publish-ios-app-without-mac-expo-eas), а этапы релиза на странице [публикация приложения в App Store](https://devoria.fr/ru/expertise/publish-app-on-app-store).

Перед первой отправкой пройди [бесплатную диагностику](https://devoria.fr/ru/diagnostic): она покажет, что блокирует твой проект, и пришлёт мой чек-лист против отказов Apple. Чтобы собрать приложение, подключить подписки и опубликовать его, [iOS & Android Kit](https://devoria.fr/ru/kits/ios) ведёт тебя по маршруту из четырёх этапов со стартовым кодом моих приложений, в твоём темпе.

## Частые вопросы

### Истекает ли push-сертификат Apple?

Сертификат .p12 истекает через год, и уведомления перестают приходить, если его не заменить. Ключ .p8 не истекает никогда: он перестаёт работать, только если ты его отзовёшь. Это главная причина выбрать ключ.

### Нужен ли отдельный push-сертификат для каждого приложения?

С сертификатом .p12 да: каждый сертификат привязан к одному приложению. Ключ .p8 подходит для всех приложений твоего аккаунта. Поэтому в Expo один ключ может покрыть весь твой каталог.

### Как продлить push-сертификат Apple?

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

### Я потерял файл .p8, что делать?

Apple позволяет скачать его только один раз. Если ключ создал EAS, Expo его хранит, и уведомления продолжают работать. Если нет, создай новый ключ, добавь его через `eas credentials`, затем отзови старый в портале Apple. Токены Expo Push твоих пользователей не меняются.

### Нужно ли пересобирать приложение после смены push-ключа?

Обычно нет. Ключ нужен серверу, который отправляет, а не установленному приложению, и Expo указывает, что новый ключ не меняет токены. Исключение: если в квитанциях `InvalidProviderToken`, Expo советует пересобрать с новым ключом и новым профилем.


## Твой проект

[Review Kit](https://devoria.fr/ru/kits/app-review): Мой чек-лист для ревью в App Store, исправленные отказы Apple, чек-лист для Google Play и три скилла для Claude Code. 55 $.

[iOS & Android Kit](https://devoria.fr/ru/kits/ios): Создай своё приложение для iPhone и Android с Claude Code: стартовый код моих приложений, путь до публикации в сторах и все киты. 109 $.

[Диагностика: что отделяет тебя от твоего iPhone-приложения](https://devoria.fr/ru/diagnostic): 7 вопросов, 60 секунд: ты узнаешь, что на самом деле мешает тебе опубликовать iPhone-приложение, получишь путь из 4 этапов и подходящий тебе кит.
