# Apple push notification certificate: .p8 of .p12 met Expo

> Voor pushmeldingen biedt Apple een .p8-sleutel zonder vervaldatum voor al je apps, of een jaarlijks .p12-certificaat. Met Expo beheert EAS de sleutel.

Originele pagina: [Apple push notification certificate: .p8 of .p12 met Expo](https://devoria.fr/nl/blog/apple-push-notification-certificate-p8-p12-expo)
Auteur: [Mehdi Azizi](https://devoria.fr/nl/mehdi-azizi)
Publicatie: 2026-11-04
Laatste inhoudsrevisie: 2026-11-04


Met het pushcertificaat van Apple mag een server meldingen naar je app sturen via APNs, de meldingendienst van Apple. Het bestaat in twee vormen: een .p12-certificaat, één jaar geldig en gekoppeld aan één app, of een .p8-sleutel, die niet verloopt en voor alle apps van je account werkt. **Met Expo heb je het certificaat niet nodig: EAS stelt bij je eerste build voor om een .p8-sleutel aan te maken, en de pushdienst van Expo gebruikt die voor je.**

De gids over [het ontwikkelaarscertificaat en het provisioning profile](https://devoria.fr/nl/blog/ios-certificaat-provisioning-profile-expo) noemt de pushsleutel in een paar regels. Hier gaan we tot de bodem: de keuze tussen de twee formaten, de omgevingen sandbox en productie, het vernieuwen, en de storingen die meldingen in TestFlight laten wegvallen.

Ik publiceer mijn apps met Expo en EAS. Solys en TradaZen declareren de plugin `expo-notifications` in hun configuratie: die maakt de app klaar om meldingen te ontvangen.

## Waarom Apple een certificaat of sleutel vraagt

Een pushmelding vertrekt vanaf een server, die van jou of die van Expo, die haar aan APNs geeft, dat haar op de iPhone aflevert. APNs moet dus controleren of die server je app mag berichten. Apple biedt twee manieren om dat te bewijzen.

- **Verbinding via token, met een .p8-sleutel.** [Volgens Apple](https://developer.apple.com/documentation/usernotifications/establishing-a-token-based-connection-to-apns) is die sneller, bruikbaar vanaf meerdere servers, en dekt één sleutel alle apps van je team of een deel ervan. Je server ondertekent er een token mee, dat minstens elk uur opnieuw moet.
- **Verbinding via certificaat, met een .p12-bestand.** [Apple vermeldt](https://developer.apple.com/documentation/usernotifications/establishing-a-certificate-based-connection-to-apns) dat dit certificaat aan één app gekoppeld is en een jaar geldig blijft. Meerdere apps, meerdere certificaten.

[Apples pagina over vervaldata](https://developer.apple.com/support/expiration/) herinnert eraan: de ondertekeningssleutel voor APNs-tokens verloopt nooit.

## De tabel .p8 / .p12

| Criterium        | .p8-sleutel                    | .p12-certificaat     |
| ---------------- | ------------------------------ | -------------------- |
| Looptijd         | Verloopt niet                  | Eén jaar             |
| Bereik           | Al je apps                     | Eén app              |
| Omgeving         | Gekozen bij aanmaken           | Sandbox en productie |
| Vernieuwen       | Nooit, behalve bij intrekken   | Elk jaar             |
| Downloaden       | Maar één keer                  | Export vanaf de Mac  |
| Aantal           | Twee per omgeving              | Eén per app          |
| Gebruik met Expo | Aangemaakt en beheerd door EAS | Niet in de Expo-docs |

Drie kanttekeningen. Het .p8-bestand [kun je maar één keer downloaden](https://developer.apple.com/help/account/keys/create-a-private-key): Apple bewaart het niet in je account. Het .p12-bestand [exporteer je vanuit de sleutelhanger van de Mac](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-a-tls-certificate) waarop het certificaat is aangemaakt. En de limiet van twee sleutels per omgeving geldt voor teamsleutels. Voor sleutels die tot bepaalde apps beperkt zijn, staat Apple er tot 200 per omgeving toe.

[Expo's pagina over credentials](https://docs.expo.dev/app-signing/app-credentials/) noemt alleen de pushsleutel, en telt er maximaal twee per account, zonder onderscheid tussen omgevingen of sleutels per app. **Voor een Expo-app is de .p8-sleutel de juiste keuze.**

## Sandbox en productie: twee omgevingen

APNs heeft twee servers: development, ook wel sandbox genoemd, en productie. [Apple](https://developer.apple.com/documentation/usernotifications/sending-notification-requests-to-apns) reserveert de eerste voor tests en de tweede voor gepubliceerde apps. De app weet welke te gebruiken via het entitlement `aps-environment`. [Volgens Apple](https://developer.apple.com/documentation/bundleresources/entitlements/aps-environment) volgt de waarde het ondertekeningsprofiel: `development` met een ontwikkelprofiel, `production` met een distributieprofiel en voor TestFlight.

**Een TestFlight-build praat dus met productie, precies zoals de App Store.**

Aan de Expo-kant twee details. [De documentatie van expo-notifications](https://docs.expo.dev/versions/latest/sdk/notifications/) zegt dat het entitlement in het project altijd als `development` staat, en in het archief van een release-build naar `production` gaat. En bij het aanmaken wordt het Expo-token gekoppeld aan de omgeving van de app, die automatisch wordt gedetecteerd: je hoeft bij het versturen niets te kiezen.

Maak je de sleutel zelf aan, dan vraagt Apple naar de omgeving en het bereik: het hele team of bepaalde apps. De ontwikkelaarsdocumentatie beschrijft inmiddels teamsleutels die beperkt zijn tot sandbox of productie, terwijl oudere sleutels die overal werken geaccepteerd blijven. [De accounthulp](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-authentication-tokens) beweert daarentegen nog dat de sleutel voor beide omgevingen werkt. Apple spreekt zichzelf tegen: onthoud de omgeving die je bij het aanmaken kiest. **Een sleutel die alleen voor sandbox is, werkt niet voor TestFlight en niet voor de App Store.**

## Hoe Expo de pushsleutel beheert

Volgens [de setupgids van Expo](https://docs.expo.dev/push-notifications/push-notifications-setup/), bijgewerkt op 28 juli 2026, stelt je eerste development build voor om pushmeldingen te configureren en een APNs-sleutel te genereren. Antwoord twee keer ja. Zonder EAS Build voer je `eas credentials` uit. Je hebt een betaald Apple Developer-account nodig.

Daarna:

- **EAS bewaart de sleutel en koppelt hem aan je app.** Volgens Expo werkt één sleutel voor zoveel apps als je wilt, en verandert het uploaden van een nieuwe sleutel de Expo Push-tokens van je gebruikers niet.
- **Je server roept APNs niet aan.** Hij stuurt naar de pushdienst van Expo, die doorstuurt naar APNs. [Expo vraagt je de receipts te lezen](https://docs.expo.dev/push-notifications/sending-notifications/) ongeveer 15 minuten na verzending: daar verschijnen de fouten.
- **De plugin zet het entitlement.** Declareer `expo-notifications` in `plugins`:

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

Twee valkuilen. [De FAQ van Expo](https://docs.expo.dev/push-notifications/faq/) zegt dat Expo Go sinds SDK 53 geen pushmeldingen meer ondersteunt, terwijl de pagina van expo-notifications alleen Android noemt. Hoe dan ook raadt Expo een development build aan: test daarmee. En de sleutel verwijderen met `eas credentials` haalt hem van de servers van Expo, niet uit je Apple-account. Om een plek vrij te maken, trek je hem in via het Apple-portaal. Zoals elk geheim mag het .p8-bestand nooit in je repository belanden: dezelfde regel als voor [API-sleutels in een Expo-app](https://devoria.fr/nl/blog/geheime-api-sleutel-expo-app-beschermen).

## Vernieuwen: wat echt verloopt

**De .p8-sleutel hoeft niet vernieuwd te worden.** Hij stopt alleen als je hem intrekt. Denk je dat hij gelekt is, dan [raadt Apple aan](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-authentication-tokens) een nieuwe sleutel te maken, daarop over te stappen en pas dan de oude in te trekken. Om de sleutel met Expo te vervangen geeft de FAQ de stappen: `eas credentials`, iOS, je buildprofiel, dan de pushsleutel verwijderen en een nieuwe genereren.

**Het .p12-certificaat verloopt elk jaar.** Apple vraagt je het vóór de vervaldatum bij te werken en de datum in de sleutelhanger in de gaten te houden. Is het verlopen of ingetrokken, dan [kun je geen meldingen meer sturen](https://developer.apple.com/help/account/certificates/certificates-overview) naar je app. Apple beschrijft geen aparte vernieuwing: je maakt een nieuw certificaat aan vanuit de identifier van de app, installeert het vóór de vervaldatum op je server en verwijdert daarna het oude. **De beste vernieuwing blijft overstappen op de sleutel.**

> Beheer je iPhones met Intune of een andere tool voor apparaatbeheer? Dat is een ander certificaat. Het pushcertificaat voor apparaatbeheer maak je aan op het Apple Push Certificates Portal en wordt elk jaar vernieuwd. [Apple raadt aan](https://support.apple.com/guide/deployment/dep2de55389a) het gebruikte Apple-account te noteren: dat heb je nodig bij het vernieuwen.

## Typische storingen en hoe je ze oplost

### Werkt in development, niet in TestFlight

1. **Je stuurt naar het verkeerde token.** De TestFlight-build registreert zich bij productie en krijgt een nieuw token. Een token uit je development build werkt niet: Apple antwoordt `BadDeviceToken` als [het token niet bij de omgeving past](https://developer.apple.com/documentation/usernotifications/handling-notification-responses-from-apns). Haal het token uit de TestFlight-app zelf.
2. **De productie-app heeft geen pushcredentials.** Dat is de diagnose uit Expo's FAQ. Controleer de credentialspagina van het project op expo.dev, of `eas credentials`.
3. **Je sleutel is beperkt tot sandbox.** Vervang hem door een sleutel die in productie werkt.
4. **De iPhone krijgt geen token.** Heb je de TestFlight-build over een Xcode-build heen geïnstalleerd, dan raadt Expo aan het apparaat opnieuw op te starten.

### "No valid aps-environment entitlement string found"

Volgens de FAQ van Expo betekent deze fout dat er geen pushsleutel is ingesteld voor je iOS-project. Controleer de credentialspagina en start een nieuwe build: EAS stelt dan voor de sleutel te genereren. Controleer ook of `expo-notifications` echt in `plugins` staat.

### ITMS-90078: Missing Push Notification Entitlement

Apple stuurt deze e-mail na het uploaden: je app lijkt zich bij APNs te registreren, maar de ondertekening bevat het entitlement `aps-environment` niet. [Expo's notitie over SDK 51](https://github.com/expo/fyi/blob/main/apns-entitlement-sdk-51.md) legt het uit. Sinds die SDK wordt het entitlement alleen toegevoegd als `expo-notifications` geïnstalleerd is. De waarschuwing komt van twee controles van Apple. De eerste vergelijkt de capabilities van je app-identifier met de entitlements van de app. De tweede vindt in de binary een registratiemethode voor meldingen, die in de code van Expo in elke app zit.

**Het is een waarschuwing, geen afwijzing**, zegt Expo. Gebruik je meldingen, voeg dan de plugin toe en bouw opnieuw: [EAS synchroniseert de capabilities](https://docs.expo.dev/build-reference/ios-capabilities/) van de app-identifier bij elke build. Zo niet, verwijder dan de capability Push Notifications van je identifier in het Apple-portaal. De waarschuwing kan blijven, zonder gevolgen.

### InvalidCredentials of alle apps tegelijk stil

`InvalidCredentials` in een receipt betekent dat je pushcredentials niet meer geldig zijn, vaak omdat de sleutel is ingetrokken. Alle apps die hem gebruikten vallen tegelijk stil. De oplossing van Expo: `eas credentials`, dan een nieuwe sleutel. Noemt de receipt `InvalidProviderToken`, dan raadt Expo aan opnieuw te bouwen en daarbij de pushsleutel en het profiel opnieuw te genereren.

## Voordat je meldingen aanzet

Om meldingen vóór de release op je iPhone te testen, volg je [TestFlight om je app te testen](https://devoria.fr/nl/blog/testflight-iphone-app-testen-voor-indienen). Stuur je stille meldingen om de app te wekken, lees dan [guideline 2.5.4 over achtergrondmodi](https://devoria.fr/nl/blog/guideline-2-5-4-achtergrondmodus-afgewezen-apple) nog eens. De hele keten zonder Mac staat in [een iOS-app publiceren zonder Mac](https://devoria.fr/nl/blog/ios-app-publiceren-zonder-mac-expo-eas), en de stappen van de release op de pagina [een app publiceren in de App Store](https://devoria.fr/nl/expertise/app-publiceren-in-app-store).

Doe vóór je eerste verzending de [gratis diagnose](https://devoria.fr/nl/diagnostic): die vertelt je wat er in je project vastloopt en stuurt je mijn checklist tegen afwijzingen door Apple. Om de app te bouwen, abonnementen te koppelen en te publiceren, volgt de [iOS & Android Kit](https://devoria.fr/nl/kits/ios) het traject in vier stappen met de Starter Code van mijn apps, in je eigen tempo.

## Veelgestelde vragen

### Verloopt het Apple-pushcertificaat?

Het .p12-certificaat verloopt na een jaar, en je meldingen stoppen als je het niet vervangt. De .p8-sleutel verloopt nooit: hij stopt alleen als je hem intrekt. Dat is de belangrijkste reden om de sleutel te kiezen.

### Heb je per app een pushcertificaat nodig?

Met een .p12-certificaat wel: elk certificaat is aan één app gekoppeld. Een .p8-sleutel werkt voor alle apps van je account. Met Expo kan één sleutel dus je hele catalogus dekken.

### Hoe vernieuw je een Apple-pushcertificaat?

Maak een nieuw certificaat aan vanuit de identifier van je app, met een nieuwe ondertekeningsaanvraag, installeer het op je server en verwijder daarna het oude. Doe dat vóór de vervaldatum. Het eenvoudigst blijft overstappen op een .p8-sleutel, die niet vernieuwd hoeft te worden.

### Ik ben mijn .p8-bestand kwijt, wat nu?

Apple laat je het maar één keer downloaden. Heeft EAS de sleutel aangemaakt, dan bewaart Expo hem en blijven je meldingen werken. Zo niet, maak een nieuwe sleutel, voeg hem toe met `eas credentials` en trek de oude in via het Apple-portaal. De Expo Push-tokens van je gebruikers veranderen niet.

### Moet je opnieuw bouwen na het wisselen van pushsleutel?

Meestal niet. De sleutel is voor de server die verstuurt, niet voor de geïnstalleerde app, en Expo geeft aan dat een nieuwe sleutel de tokens niet verandert. Uitzondering: melden de receipts `InvalidProviderToken`, dan raadt Expo aan opnieuw te bouwen met een nieuwe sleutel en een nieuw profiel.


## Je project

[Review Kit](https://devoria.fr/nl/kits/app-review): Mijn App Store-reviewchecklist, mijn opgeloste afwijzingen door Apple, die voor Google Play en drie Claude Code-skills. € 49.

[iOS & Android Kit](https://devoria.fr/nl/kits/ios): Bouw je iPhone- en Android-app met Claude Code: de startcode van mijn apps, de route naar de stores en alle kits. € 99.

[Diagnose: wat staat er tussen jou en je iPhone-app](https://devoria.fr/nl/diagnostic): 7 vragen, 60 seconden: je weet wat je echt tegenhoudt om je iPhone-app te publiceren, je traject in 4 stappen en de kit die bij je past.
