如何为 APN 有效负载数据创建要存储在托管服务器中的 .pem 文件?
11 回答
这是我所做的,来自:blog.boxedice.com和“iPhone 高级项目”第 10 章,作者是 Joe Pezzillo。
使用钥匙串中的 aps_developer_identity.cer:
- 从本地 Mac 和登录钥匙串启动钥匙串访问,按证书类别过滤。您将看到一个名为“Apple Development Push Services”的可扩展选项</li>
- 右击“Apple Development Push Services”>导出“Apple Development Push Services ID123”。将此作为
apns-dev-cert.p12
文件保存在您可以访问的地方。无需输入密码。 下一个命令在 Mac 的终端中为 PEM 格式(隐私增强邮件安全证书)生成证书:
openssl pkcs12 -in apns-dev-cert.p12 -out apns-dev-cert.pem -nodes -clcerts
在服务器上使用 chmod 400 设置此未加密密钥的文件权限。
发展阶段:
第 1 步: 从证书 .p12 创建证书 .pem
openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
第 2 步:从密钥 .p12 创建密钥 .pem
openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
第 3 步(可选):如果要删除第二步中询问的密码短语
openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem
第 4 步:现在我们必须合并 Key .pem 和 Certificate .pem 以获得应用程序开发阶段推送通知所需的 Development .pem。
如果执行了第 3 步,请运行:
cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem
如果未执行第 3 步,请运行:
cat apns-dev-cert.pem apns-dev-key.pem > apns-dev.pem
第 5 步:检查证书有效性和与 APNS 的连接
如果执行了第 3 步,请运行:
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert apns-dev-cert.pem -key apns-dev-key-noenc.pem
如果未执行第 3 步,请运行:
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert apns-dev-cert.pem -key apns-dev-key.pem
生产阶段:
第 1 步: 从证书 .p12 创建证书 .pem
openssl pkcs12 -clcerts -nokeys -out apns-pro-cert.pem -in apns-pro-cert.p12
第 2 步:从密钥 .p12 创建密钥 .pem
openssl pkcs12 -nocerts -out apns-pro-key.pem -in apns-pro-key.p12
第 3 步(可选):如果要删除第二步中询问的密码短语
openssl rsa -in apns-pro-key.pem -out apns-pro-key-noenc.pem
第 4 步:现在我们必须合并 Key .pem 和 Certificate .pem 以获得在 App 的生产阶段推送通知所需的 Production .pem。
如果执行了第 3 步,请运行:
cat apns-pro-cert.pem apns-pro-key-noenc.pem > apns-pro.pem
如果未执行第 3 步,请运行:
cat apns-pro-cert.pem apns-pro-key.pem > apns-pro.pem
第 5 步:检查证书有效性和与 APNS 的连接。
如果执行了第 3 步,请运行:
openssl s_client -connect gateway.push.apple.com:2195 -cert apns-pro-cert.pem -key apns-pro-key-noenc.pem
如果未执行第 3 步,请运行:
openssl s_client -connect gateway.push.apple.com:2195 -cert apns-pro-cert.pem -key apns-pro-key.pem
脚步:
- 使用钥匙串访问创建 CSR
- 使用密钥链访问使用私钥创建 P12
- APNS 应用 ID 和证书
这为您提供了三个文件:
- 企业社会责任
- 私钥作为 p12 文件 (
PushChatKey.p12
) - SSL证书,
aps_development.cer
转到您下载文件的文件夹,在我的情况下是桌面:
$ cd ~/Desktop/
将 .cer 文件转换为 .pem 文件:
$ openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem
将私钥的 .p12 文件转换为 .pem 文件:
$ openssl pkcs12 -nocerts -out PushChatKey.pem -in PushChatKey.p12
输入导入密码:
MAC verified OK
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
您首先需要输入 .p12 文件的密码,以便 openssl 可以读取它。然后您需要输入将用于加密 PEM 文件的新密码。在本教程中,我再次使用“pushchat”作为 PEM 密码。你应该选择更安全的东西。注意:如果您不输入 PEM 密码,openssl 不会给出错误消息,但生成的 .pem 文件中不会包含私钥。
最后,将证书和密钥组合成一个 .pem 文件:
$ cat PushChatCert.pem PushChatKey.pem > ck.pem
启动终端应用程序并在提示后输入以下命令
openssl pkcs12 -in CertificateName.p12 -out CertificateName.pem -nodes
->> Apple 自己的教程<<- 是我遇到的唯一有效的指令集。这很简单,我可以确认它在 linux php 服务器和 windows php 服务器上都能很好地工作。
您可以在页面底部找到他们的 5 步 pem 创建过程。
注意:您必须在 App Store Connect 中拥有 Team Agent 或 Admin 角色才能执行任何这些任务。如果您不是 App Store Connect 中团队的一员,这可能不会影响您。
向 iOS 应用程序发送推送通知需要创建加密密钥。在过去,这是一个使用 SSL 密钥和证书的繁琐过程。每个 SSL 证书都特定于单个 iOS 应用程序。2016 年,Apple 推出了一种更可靠、更易于使用的新身份验证密钥机制。与 iOS 应用程序相比,新的身份验证密钥更灵活、更易于维护和应用。
尽管自引入身份验证密钥以来已经有好几年了,但并非每个服务都支持它们。FireBase 和 Amazon Pinpoint 支持身份验证密钥。Amazon SNS、Urban Airship、Twilio 和 LeanPlum 没有。许多开源软件包尚不支持身份验证密钥。
创建所需的 SSL 证书并将其导出为包含公钥和私钥的 PEM 文件:
- 导航到证书、标识符和配置文件
- 创建或编辑您的应用 ID。
- 为 App ID 启用推送通知
- 将 SSL 证书添加到 App ID
- 将证书转换为 PEM 格式
如果您已经在 Apple Developer Center 网站中为应用设置了 SSL 证书,您可以跳过将证书转换为 PEM 格式。请记住,如果您还没有在创建上传到 Apple 的签名请求的 Mac 上生成的私钥,您将遇到问题。
继续阅读以了解如何避免丢失该私钥。
导航到证书、标识符和配置文件
Xcode 不控制推送通知的证书或密钥。要为应用创建密钥并启用推送通知,您必须访问 Apple Developer Center 网站。您帐户的证书、标识符和配置文件部分控制应用程序 ID 和证书。
要访问证书和个人资料,您必须拥有付费的 Apple Developer Program 会员资格或成为拥有该会员资格的团队的一员。
- 登录Apple 开发者网站
- 转到Account,然后是Certificates, Identifiers & Profiles
创建应用 ID
使用推送通知的应用程序不能使用通配符应用程序 ID 或配置文件。每个应用程序都要求您在 Apple Developer Center 门户中设置应用程序 ID 记录以启用推送通知。
- 转到标识符下的应用程序 ID
- 使用捆绑标识符搜索您的应用。它可能已经存在。
- 如果应用程序没有现有的应用程序 ID,请单击 (+) 按钮来创建它。
- 在App ID Suffix 部分 中选择显式 App ID 。
- 输入应用程序的包标识符。
- 滚动到底部并启用推送通知。
- 单击继续。
- 在下一个屏幕上单击注册以完成创建 App ID。
为 App ID 启用推送通知
为推送通知创建 SSL 证书是一个包含多个任务的过程。每个任务都有几个步骤。所有这些都是以 P12 或 PEM 格式导出密钥所必需的。在继续之前查看这些步骤。
将 SSL 证书添加到 App ID
要创建证书,您需要在 Mac 上提出证书签名请求 (CSR) 并将其上传到 Apple。
稍后,如果您需要将此证书导出为 pkcs12(又名 p12)文件,您将需要使用同一 Mac中的钥匙串。创建签名请求时,Keychain Access 会在默认钥匙串中生成一组密钥。这些密钥对于使用 Apple 将根据签名请求创建的证书是必需的。
拥有一个专门用于开发凭据的单独钥匙串是一种很好的做法。如果您这样做,请确保在使用证书助手之前将此钥匙串设置为默认值。
为开发凭证创建钥匙串
- 在 Mac 上打开钥匙串访问
- 在文件菜单中选择新建钥匙串...
- 为您的钥匙串起一个描述性名称,例如“共享开发”或您的应用程序的名称
创建证书签名请求 (CSR)
创建证书签名请求时,证书助手会在默认钥匙串中生成两个加密密钥。将开发钥匙串设为默认非常重要,这样钥匙就在正确的钥匙串中。
- 在 Mac 上打开钥匙串访问。
- 按住 Control 键单击钥匙串列表中的开发钥匙串
- 选择使钥匙串“共享开发”默认
- 从Keychain Access菜单中选择Certificate Assistant,然后从子菜单中 Request a Certificate From a Certificate Authority...。
- 当 Certificate Assistant 出现时,选中Saved To Disk。
- 在“用户电子邮件地址”字段中输入与您的 Apple Developer Program 会员资格相关联的电子邮件地址。
- 在Common Name字段中输入密钥的名称。使用应用程序的捆绑 ID 作为通用名称的一部分是个好主意。这可以很容易地分辨出哪些证书和密钥属于哪个应用程序。
- 单击继续。证书助理将提示将签名请求保存到文件中。
- 在钥匙串访问中,再次将“登录”钥匙串设为默认值。
创建签名请求会生成一对密钥。在上传签名请求之前,请验证开发钥匙串是否具有密钥。它们的名称将与签名请求中使用的通用名称相同。
上传证书签名请求 (CSR)
创建证书签名请求后,将其上传到 Apple Developer Center。Apple 将根据签名请求创建推送通知证书。
您的开发钥匙串现在应该在钥匙串访问中的我的证书下显示带有私钥的推送证书:
此时应备份开发钥匙串。许多团队将推送证书保存在安全的 USB 驱动器上,致力于内部版本控制或使用 Time Machine 等备份解决方案。开发钥匙串可以在不同的团队成员之间共享,因为它不包含任何个人代码签名凭据。
钥匙串文件位于
~/Library/Keychains
.
一些第三方推送服务需要隐私增强邮件 (PEM) 格式的证书,而另一些则需要公钥加密标准 #12(PKCS12 或 P12)。从 Apple 下载的证书可用于导出这些格式的证书 - 但前提是您保留了私钥。
将证书转换为 PEM 格式
你可以看看这里。我有用图像描述的详细过程,从创建证书到应用程序密钥到配置文件,再到最终的 pem。 http://docs.moengage.com/docs/apns-certificate-pem-file
这就是我在 Windows 7 上安装OpenSSL后的做法(链接转到 Win32 安装程序,选择最新版本而不是精简版)。
使用这种方法,您只需.cer
要从 Apple 下载的文件。
c:\OpenSSL-Win32\bin\openssl.exe x509 -in aps_development.cer -inform DER -out developer_identity.pem -outform PEM
这将创建一个文件,然后您也需要添加您的私钥。
-----
开始私钥-- MIIEuwIBADANBgkqhk....等
MIIEuwIBADANBgkqhk....等
MIIEuwIBADANBgkqhk....等
MIIEuwIBADANBgkqhk....等
-----结束私钥----- -----开始 证书
-----
AwiBAgwIBADAwIBADA....等
AwiBAgwIBADAwIBADA..
等
就是这样。
如果您的钥匙串访问权限中已经有 apns p12 文件,则有一种创建 .Pem 文件的最简单方法。
打开终端并输入以下命令:
对于开发 openssl pkcs12 -in apns-div-cert.p12 -out apns-div-cert.pem -nodes -clcerts
对于生产 openssl pkcs12 -in apns-dist-cert.p12 -out apns-dist-cert.pem -nodes -clcerts
用这个名字重命名你的 P12 文件:apns-div-cert.p12 否则你需要输入你的文件名而不是这个。谢谢!!
我不记得openssl
创建.pem
文件所需的命令,所以我制作了这个 bash 脚本来简化这个过程:
#!/bin/bash
if [ $# -eq 2 ]
then
echo "Signing $1..."
if ! openssl pkcs12 -in $1 -out $2 -nodes -clcerts; then
echo "Error signing certificate."
else
echo "Certificate created successfully: $2"
fi
else
if [ $# -gt 2 ]
then
echo "Too many arguments"
echo "Syntax: $0 <input.p12> <output.pem>"
else
echo "Missing arguments"
echo "Syntax: $0 <input.p12> <output.pem>"
fi
fi
例如,为其命名,signpem.sh
并将其保存在用户的文件夹 ( /Users/<username>
?) 中。创建文件后,执行 achmod +x signpem.sh
使其可执行,然后您可以运行:
~/signpem myCertificate.p12 myCertificate.pem
并将myCertificate.pem
被创建。