前置條件
- 已在 Apple Developer 門網下載 `aps_development.cer`(開發環境)或 `aps_production.cer`(生產環境)。
- 已在鑰匙圈 將憑證匯出為 `push.p12`(含私鑰),設定匯出密碼(如 `123456`)。
- 終端機當前目錄為存放上述檔案的資料夾(如 `~/Desktop/push`)。
四步指令產生 `apns-dev.pem`
# 1. 將 .cer 轉為 .pem (僅公開金鑰)
openssl x509 -in aps_development.cer -inform der -out aps_development.pem
# 2. 將 .p12 轉為 .pem (含私鑰),需輸入匯出密碼與新 PEM 密碼
openssl pkcs12 -nocerts -in push.p12 -out push_key.pem
# 輸入匯入密碼 (Import Password): 123456
# 輸入 PEM 密碼 (PEM pass phrase): 123456
# 確認 PEM 密碼: 123456
# 3. 移除私鑰 PEM 密碼(伺服器端通常需無密碼金鑰)
openssl rsa -in push_key.pem -out push_key_nopass.pem
# 輸入 PEM 密碼: 123456
# 4. 合併公開金鑰與無密碼私鑰為最終 apns-dev.pem
cat aps_development.pem push_key_nopass.pem > apns-dev.pem
驗證 PEM 可用性
# 測試連線 Apple Push Gateway (開發環境)
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert apns-dev.pem
# 若顯示 "Verify return code: 0 (ok)" 並進入互動模式,表示憑證正確
生產環境對應檔案名
| 環境 | CER 檔 | P12 檔 | 最終 PEM |
| Development | aps_development.cer | push.p12 | apns-dev.pem |
| Production | aps_production.cer | push_prod.p12 | apns-prod.pem |
常見錯誤與解決
| 錯誤訊息 | 原因 | 解決 |
| `command not found` | 未安裝 OpenSSL 或未加入 PATH | macOS 內建 OpenSSL,確認終端路徑;Windows 用 Git Bash 或安裝 OpenSSL |
| `unable to load certificates` | .cer 非 DER 格式 | 鑰匙圈匯出時選「Certificate (.cer)」,非 .p12 |
| `Mac verify error` | P12 密碼錯誤 | 重新輸入正確匯出密碼 |
| 伺服器報 `Invalid token` | 使用開發憑證連生產 gateway 或反之 | 確認 `gateway.sandbox.push.apple.com` (開發) vs `gateway.push.apple.com` (生產) |
自動化腳本(可直接複製執行)
#!/bin/bash
set -e
CER="aps_development.cer"
P12="push.p12"
PASS="123456" # 修改為你的 p12 匯出密碼
openssl x509 -in "$CER" -inform der -out cert.pem
openssl pkcs12 -nocerts -in "$P12" -out key_with_pass.pem -passin pass:"$PASS" -passout pass:"$PASS"
openssl rsa -in key_with_pass.pem -out key.pem -passin pass:"$PASS"
cat cert.pem key.pem > apns-dev.pem
echo "✅ apns-dev.pem generated"
總結
四條 OpenSSL 指令:`cer→pem`、`p12→pem(含私鑰)`、`移除私鑰密碼`、`合併`。產出的 `apns-dev.pem` 即為推送伺服器所需憑證檔,記得區分開發/生產環境對應的 Gateway 域名。
- 上一篇文章: Wireshark/PCAP:從已知十六進制封包資料手工構建 PCAP 檔案完整流程
- 下一篇文章: HTML 雙層級聯下拉選單:第一層選表名,第二層動態載入欄位名
Copyright ©
程式碼之家 All Rights Reserved