首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 生成 APNs 推送所需 PEM 證書完整步驟指南

     編輯:PHP 相關知識

前言

Apple Push Notification Service (APNs) 要求使用 PEM 格式證書建立 TLS 連線。本文詳細記錄從 Apple Developer 後台申請到生成 apns-dev.pem / apns-prod.pem 的完整流程,適用於 PHP 服務端推送開發。

前置條件

  • Apple Developer Program 成員資格
  • Mac 電腦(需 Keychain Access 操作)
  • 已安裝 OpenSSL 命令行工具

步驟詳解

1. 建立 App ID 並啟用 Push Notifications

  1. 登入 Apple Developer Portal → Certificates, Identifiers & Profiles → Identifiers
  2. 點擊 + 新增 App ID,選擇 Explicit App ID(不可用 Wildcard),填寫 Bundle ID(如 com.example.app)
  3. 勾選 Push Notifications 服務,完成註冊

2. 生成 Certificate Signing Request (CSR)

  1. 打開 Mac 鑰匙串存取 → 憑證助理 → 從憑證機構請求憑證
  2. 輸入用戶郵箱、常用名稱,選擇 存儲到磁盤,生成 CertificateSigningRequest.certSigningRequest

3. 建立 APNs SSL 憑證

  1. 回到 Developer Portal,選擇該 App ID → Configure → Push Notifications 區塊
  2. 選擇 Development SSL Certificate(開發)或 Production SSL Certificate(生產)
  3. 上傳步驟 2 生成的 .certSigningRequest 文件
  4. 下載生成的 aps_development.cer 或 aps_production.cer

4. 導入憑證並導出 .p12

  1. 雙擊下載的 .cer 文件自動導入鑰匙串
  2. 在鑰匙串中展開 Apple Development/Production Push Services,右鍵選擇「導出」
  3. 保存為 apns-dev-cert.p12(開發)或 apns-prod-cert.p12(生產),設置導出密碼(記住)
  4. 同樣導出對應的私鑰為 apns-dev-key.p12 / apns-prod-key.p12

5. OpenSSL 轉換為 PEM 格式

打開終端機執行:

# 憑證 .p12 → .pem (無需密鑰)
openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12

# 私鑰 .p12 → .pem (需輸入導出密碼,再設置 PEM 密語)
openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12

# 移除私鑰密語(PHP stream_context 需無密語私鑰)
openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem

# 合併憑證與無密語私鑰為最終 PEM
cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem

6. 驗證連線測試

# 開發環境沙箱
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert apns-dev-cert.pem -key apns-dev-key-noenc.pem

# 生產環境
openssl s_client -connect gateway.push.apple.com:2195 -cert apns-prod-cert.pem -key apns-prod-key-noenc.pem

若顯示 CONNECTED 並返回憑證鏈資訊,證書配置正確。

PHP 代碼中使用示例

$ctx = stream_context_create([
    'ssl' => [
        'local_cert' => '/path/to/apns-dev.pem',
        'passphrase' => '', // 已移除密語留空
        'verify_peer' => false,
    ]
]);

$fp = stream_socket_client(
    'ssl://gateway.sandbox.push.apple.com:2195',
    $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx
);

if (!$fp) {
    throw new Exception("APNs 連線失敗: $errstr ($err)");
}
// 發送二進制載荷...
fwrite($fp, $payload);
fclose($fp);

關鍵提醒

  • 環境區分:開發用 gateway.sandbox.push.apple.com,生產用 gateway.push.apple.com,證書不可混用。
  • 證書過期:APNs 憑證有效期 1 年,需定期更新並重新部署。
  • PHP 版本:PHP 5.6+ 建議啟用 verify_peer_name 提升安全性。
  • 新協議:Apple 推出 HTTP/2 版 APNs (api.push.apple.com),支援 JWT 驗證,新專案建議遷移至 HTTP/2 API。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved