# Apple プッシュ通知証明書：Expoなら.p8と.p12どっち？

> Appleのプッシュ通知には、有効期限がなく全アプリで使える.p8キーと、毎年更新の.p12証明書があります。ExpoならEASがキーを管理します。

元のページ：[Apple プッシュ通知証明書：Expoなら.p8と.p12どっち？](https://devoria.fr/ja/blog/apple-push-notification-certificate-p8-p12-expo)
著者：[Mehdi Azizi](https://devoria.fr/ja/mehdi-azizi)
公開日：2026-11-04
内容の最終更新：2026-11-04


Appleのプッシュ証明書は、サーバーがAppleの通知サービスであるAPNsを通じてアプリに通知を送ることを許可するものです。形式は2つあります。有効期間1年で1つのアプリに紐づく.p12証明書と、有効期限がなくアカウント内の全アプリで使える.p8キーです。**Expoなら証明書は不要です。最初のビルド時にEASが.p8キーの作成を提案してくれて、Expoのプッシュサービスがそれを代わりに使ってくれます。**

[開発者証明書とプロビジョニングプロファイル](https://devoria.fr/ja/blog/ios-certificate-provisioning-profile-expo)のガイドでは、プッシュキーについて数行しか触れていません。この記事では最後まで掘り下げます。2つの形式の選び方、sandboxとproductionの環境、更新、そしてTestFlightで通知が届かなくなる障害についてです。

僕はExpoとEASでアプリを公開しています。SolysとTradaZenは設定で`expo-notifications`プラグインを宣言しています。アプリが通知を受け取れるよう準備するのはこのプラグインです。

## Appleが証明書やキーを求める理由

プッシュ通知は、自分のサーバーかExpoのサーバーから送られ、APNsに渡され、APNsがiPhoneに届けます。つまりAPNsは、そのサーバーにアプリへ送信する権限があるかを確認する必要があります。Appleはその証明方法を2つ用意しています。

- **.p8キーによるトークンベースの接続。** [Appleによると](https://developer.apple.com/documentation/usernotifications/establishing-a-token-based-connection-to-apns)、こちらのほうが高速で、複数のサーバーから使え、1つのキーでチームの全アプリまたは一部のアプリをカバーできます。サーバーはこのキーでトークンに署名し、そのトークンは少なくとも1時間ごとに作り直す必要があります。
- **.p12ファイルによる証明書ベースの接続。** [Appleの説明](https://developer.apple.com/documentation/usernotifications/establishing-a-certificate-based-connection-to-apns)では、この証明書は1つのアプリに紐づき、有効期間は1年です。アプリが複数なら証明書も複数必要です。

[Appleの有効期限に関するページ](https://developer.apple.com/support/expiration/)にもあるとおり、APNsのトークン署名キーは期限切れになりません。

## .p8と.p12の比較表

| 項目         | .p8キー                  | .p12証明書                   |
| ------------ | ------------------------ | ---------------------------- |
| 有効期間     | 期限なし                 | 1年                          |
| 対象範囲     | 全アプリ                 | 1つのアプリのみ              |
| 環境         | 作成時に選択             | sandboxとproduction          |
| 更新         | 不要（失効させない限り） | 毎年                         |
| ダウンロード | 1回のみ                  | Macから書き出し              |
| 数           | 環境ごとに2つ            | アプリごとに1つ              |
| Expoでの利用 | EASが作成・管理          | Expoのドキュメントに記載なし |

補足が3つあります。.p8ファイルは[1回しかダウンロードできません](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)。また、環境ごとに2つという上限はチームキーの話です。特定のアプリに限定したキーなら、Appleは環境ごとに最大200個まで認めています。

[Expoの認証情報に関するページ](https://docs.expo.dev/app-signing/app-credentials/)はプッシュキーにしか触れておらず、上限をアカウントあたり最大2つとしていて、環境やアプリ別キーの区別はしていません。**Expoアプリなら、.p8キーが正解です。**

## sandboxとproduction：2つの環境

APNsには開発用（sandboxとも呼ばれます）と本番用の2つのサーバーがあります。[Apple](https://developer.apple.com/documentation/usernotifications/sending-notification-requests-to-apns)は前者をテスト用、後者を公開済みアプリ用としています。どちらを使うかは、アプリの`aps-environment` entitlementで決まります。[Appleによると](https://developer.apple.com/documentation/bundleresources/entitlements/aps-environment)、その値は署名プロファイルに従います。開発用プロファイルなら`development`、配布用プロファイルとTestFlightなら`production`です。

**つまりTestFlightのビルドは、App Storeとまったく同じくproductionと通信します。**

Expo側では2つ注意点があります。[expo-notificationsのドキュメント](https://docs.expo.dev/versions/latest/sdk/notifications/)によると、プロジェクト内のentitlementは常に`development`と書かれ、リリースビルドのアーカイブで`production`に切り替わります。また、Expoのトークンは作成時にアプリの環境に紐づけられ、それは自動で検出されます。送信時に何かを選ぶ必要はありません。

自分でキーを作る場合、Appleは環境と対象範囲（チーム全体か特定のアプリか）を聞いてきます。開発者向けドキュメントでは現在、sandboxまたはproductionに限定したチームキーが説明されていて、どちらでも使える従来のキーも引き続き使えます。ところが[アカウントのヘルプ](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-authentication-tokens)では、いまだにキーは両方の環境で使えると書かれています。Apple自身が矛盾しているので、作成時に選んだ環境を基準に考えてください。**sandbox専用のキーは、TestFlightでもApp Storeでも使えません。**

## Expoはプッシュキーをどう管理するか

[Expoのセットアップガイド](https://docs.expo.dev/push-notifications/push-notifications-setup/)（2026年7月28日更新）によると、最初の開発ビルドでプッシュ通知の設定とAPNsキーの生成を提案されます。どちらも「はい」と答えましょう。EAS Buildを使わない場合は`eas credentials`を実行します。有料のApple Developerアカウントが必要です。

その後は次のとおりです。

- **EASがキーを保管し、アプリに紐づけます。** Expoによると、1つのキーは何個のアプリにでも使え、新しいキーをアップロードしてもユーザーのExpo Pushトークンは変わりません。
- **自分のサーバーはAPNsを呼び出しません。** Expoのプッシュサービスに送り、それがAPNsに転送します。[Expoは送信から約15分後にレシートを確認するよう求めています](https://docs.expo.dev/push-notifications/sending-notifications/)。エラーが表示されるのはそこです。
- **プラグインがentitlementを設定します。** `plugins`に`expo-notifications`を宣言してください。

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

落とし穴が2つあります。[ExpoのFAQ](https://docs.expo.dev/push-notifications/faq/)では、SDK 53以降Expo Goはプッシュ通知に対応しないとされていますが、expo-notificationsのページではAndroidのみが対象になっています。どちらにしてもExpoは開発ビルドを推奨しているので、それでテストしましょう。また、`eas credentials`でキーを削除しても、消えるのはExpoのサーバーからで、Appleアカウントからではありません。枠を空けたいなら、Appleのポータルで失効させてください。他のシークレットと同じく、.p8ファイルは絶対にリポジトリに入れないこと。ルールは[ExpoアプリのAPIキー](https://devoria.fr/ja/blog/expo-secret-api-key-what-to-protect)と同じです。

## 更新：本当に期限が切れるもの

**.p8キーは更新不要です。** 止まるのは自分で失効させたときだけです。漏洩した疑いがあるなら、[Appleの推奨](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-authentication-tokens)は、新しいキーを作成して切り替え、そのあとで古いキーを失効させることです。Expoでキーを差し替える手順はFAQにあります。`eas credentials`、iOS、ビルドプロファイルの順に選び、プッシュキーを削除して新しいキーを生成します。

**.p12証明書は毎年期限が切れます。** Appleは期限前に更新し、キーチェーンで有効期限を確認するよう求めています。期限切れや失効になると、[アプリに通知を送れなくなります](https://developer.apple.com/help/account/certificates/certificates-overview)。Appleは独立した更新手順を説明していません。アプリのIDから新しい証明書を作成し、期限前にサーバーにインストールしてから、古い証明書を外します。**一番の更新方法は、キーに移行することです。**

> IntuneなどのデバイスMDMツールでiPhoneを管理していますか？それは別の証明書です。デバイス管理用のプッシュ証明書はApple Push Certificates Portalで作成し、毎年更新します。[Appleは](https://support.apple.com/guide/deployment/dep2de55389a)使ったAppleアカウントをメモしておくよう勧めています。更新時に必要になるからです。

## よくある障害と対処法

### 開発では動くのにTestFlightでは動かない

1. **送信先のトークンが違います。** TestFlightビルドはproductionに登録され、新しいトークンを取得します。開発ビルドのトークンは使えません。[トークンが環境と一致しない](https://developer.apple.com/documentation/usernotifications/handling-notification-responses-from-apns)場合、Appleは`BadDeviceToken`を返します。TestFlightアプリそのものからトークンを取得してください。
2. **本番アプリにプッシュの認証情報がありません。** ExpoのFAQにある診断です。expo.devのプロジェクトの認証情報ページか、`eas credentials`で確認しましょう。
3. **キーがsandbox限定になっています。** productionで使えるキーに置き換えてください。
4. **iPhoneがトークンを取得できていません。** Xcodeビルドの上にTestFlightビルドをインストールした場合、Expoはデバイスの再起動を勧めています。

### 「No valid aps-environment entitlement string found」

ExpoのFAQによると、このエラーはiOSプロジェクトにプッシュキーが設定されていないことを示します。認証情報ページを確認してから、ビルドし直してください。EASがキーの生成を提案してくれます。`plugins`に`expo-notifications`がちゃんと入っているかも確認しましょう。

### ITMS-90078: Missing Push Notification Entitlement

このメールは提出後にAppleから届きます。アプリがAPNsに登録しようとしているように見えるのに、署名に`aps-environment` entitlementが含まれていない、という内容です。[ExpoのSDK 51に関するノート](https://github.com/expo/fyi/blob/main/apns-entitlement-sdk-51.md)が説明しています。このSDK以降、entitlementは`expo-notifications`がインストールされている場合にしか追加されません。警告はAppleの2つのチェックから来ます。1つ目はApp IDのケイパビリティとアプリのentitlementを比較するもの。2つ目はバイナリ内の通知登録メソッドを検出するもので、Expoのコードにはこれがどのアプリにも含まれています。

**これは警告であってリジェクトではない**、とExpoは説明しています。通知を使うならプラグインを追加してビルドし直してください。[EASはビルドのたびにApp IDのケイパビリティを同期します](https://docs.expo.dev/build-reference/ios-capabilities/)。使わないなら、AppleのポータルでApp IDからPush Notificationsケイパビリティを外してください。警告が残ることもありますが、影響はありません。

### InvalidCredentials、または全アプリが一斉に沈黙

レシートに`InvalidCredentials`が出たら、プッシュの認証情報が無効になっているという意味です。多くはキーが失効させられたのが原因です。そのキーを使っていた全アプリが同時に通知を送れなくなります。Expoの対処法は、`eas credentials`で新しいキーを作ることです。レシートに`InvalidProviderToken`とある場合、Expoはプッシュキーとプロファイルを再生成してビルドし直すよう勧めています。

## 通知を有効にする前に

リリース前に自分のiPhoneで通知をテストするなら、[TestFlightでアプリをテストする](https://devoria.fr/ja/blog/testflight-iphone-app-beta-testing)を参考にしてください。アプリを起こすためにサイレント通知を送るなら、[バックグラウンドモードに関するガイドライン2.5.4](https://devoria.fr/ja/blog/guideline-2-5-4-background-mode-rejected)を読み直しましょう。Macなしの全工程は[MacなしでiOSアプリを公開する](https://devoria.fr/ja/blog/publish-ios-app-without-mac-expo-eas)に、リリースの手順は[App Storeにアプリを公開する](https://devoria.fr/ja/expertise/publish-app-on-app-store)のページにまとめています。

最初の送信の前に、[無料の診断](https://devoria.fr/ja/diagnostic)を受けてみてください。プロジェクトで何が障害になっているかがわかり、僕のApple リジェクト対策チェックリストも届きます。アプリを作り、サブスクリプションを組み込み、公開するまでなら、[iOS & Android Kit](https://devoria.fr/ja/kits/ios)が僕のアプリのスターターコード付きで4ステップの流れを自分のペースで案内します。

## よくある質問

### Appleのプッシュ証明書は期限切れになりますか？

.p12証明書は1年で期限が切れ、差し替えないと通知が止まります。.p8キーは期限切れになりません。止まるのは失効させたときだけです。キーを選ぶ一番の理由はこれです。

### プッシュ証明書はアプリごとに必要ですか？

.p12証明書なら必要です。証明書はそれぞれ1つのアプリに紐づきます。.p8キーはアカウント内の全アプリで使えます。つまりExpoなら、1つのキーで全アプリをカバーできます。

### Appleのプッシュ証明書はどう更新しますか？

新しい証明書署名要求を使って、アプリのIDから新しい証明書を作成し、サーバーにインストールしてから古い証明書を外します。期限前に行ってください。一番簡単なのは、更新不要の.p8キーに移行することです。

### .p8ファイルをなくしたらどうすればいいですか？

Appleでは1回しかダウンロードできません。EASがキーを作成したなら、Expoが保管しているので通知は止まりません。そうでなければ、新しいキーを作成して`eas credentials`で追加し、Appleのポータルで古いキーを失効させてください。ユーザーのExpo Pushトークンは変わりません。

### プッシュキーを変えたらビルドし直す必要がありますか？

通常は不要です。キーは送信側のサーバーで使うもので、インストール済みのアプリでは使いません。Expoも新しいキーでトークンは変わらないとしています。例外として、レシートに`InvalidProviderToken`が出る場合は、新しいキーとプロファイルでビルドし直すようExpoは勧めています。


## あなたのプロジェクト

[Review Kit](https://devoria.fr/ja/kits/app-review)：私のApp Store審査チェックリスト、修正済みのAppleのリジェクト事例、Google Play用チェックリスト、Claude Codeのスキル3つ。￥8,500。

[iOS & Android Kit](https://devoria.fr/ja/kits/ios)：Claude CodeでiPhoneとAndroidのアプリを作りましょう。私のアプリのスターターコード、ストア公開までの手順、すべてのキットが揃っています。￥17,500。

[診断：あなたとiPhoneアプリの間にあるもの](https://devoria.fr/ja/diagnostic)：7つの質問、60秒。iPhoneアプリの公開を本当に妨げているもの、4ステップのロードマップ、あなたに合ったキットがわかります。
