为APNS创建.pem文件?

189

我该如何创建一个.pem文件以存储在托管服务器上用于APN负载数据?


1
我可以使用.p12文件代替.pem文件来进行APNS推送吗? - Gajendra K Chauhan
FYI .pem 的定义:https://serverfault.com/a/21158/193377 PEM 本身并不是证书,它只是一种编码数据的方式。... 它是安全的,可以粘贴到电子邮件正文中,因为它有锚定行并且是7位清晰的。 - AnneTheAgile
11个回答

381

以下是我的做法:来源自于 boxeddice 的博客和 Joe Pezzillo 的 "iPhone Advanced Projects" 第 10 章。

在钥匙串中使用 aps_developer_identity.cer 后:

  1. 从本地 Mac 上启动 Keychain Access,从登陆钥匙串中按证书类别进行筛选。您将看到一个可扩展的选项叫做 “Apple Development Push Services”。
  2. 右键单击“Apple Development Push Services”> 导出 “Apple Development Push Services ID123”。将其保存为可以访问的 apns-dev-cert.p12 文件。无需输入密码。
  3. 下一条命令会在 Mac 的终端上生成 PEM 格式(隐私增强型邮件安全证书)的证书:

    openssl pkcs12 -in apns-dev-cert.p12 -out apns-dev-cert.pem -nodes -clcerts
    
    在服务器上,使用 chmod 400 命令设置此未加密密钥的文件权限。

3
我已按照上述步骤操作,现在它正在运行。我已将证书和php脚本放置在我的本地Web服务器(Xampp)上。我能够获取设备令牌,并将其用于php脚本中。php脚本能够连接并发送有效载荷数据。但即使如此,我仍然无法收到PUSH通知。问题出在哪里?通知需要时间才能到达吗? - Biranchi
14
在 Mavericks (10.9) 的钥匙串访问中,有一个导出为 .pem 的选项!只需右键点击 Keychain Access 中的 "Apple Development/Production iOS Push Services certificate" 并选择导出。将文件格式更改为 .pem - 完成! 另外可用的导出选项是:.p7b 和 .p12 - tylerl
6
.pem对于我被禁用了,Yosemite beta7。我在创建.pem时遇到了一些问题,当我打开它时,它说是用于分发而不是开发。 - Cristi Băluță
3
.pem 对我来说并没有被禁用,但我无法保存为p12格式。这是它的样子:http://i.imgur.com/U2M40dU.png - FooBar
2
在 macOS 10.14 Mojave 中,您可以使用 Keychain Access 应用程序选择将您的“Apple Push Services: com.yourBundleIdentifier 证书”导出为“隐私增强邮件 (.pem)”文件格式,并在任何时候保存。 - Oleh Veheria
显示剩余4条评论

250

开发阶段:

步骤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: 现在,我们必须合并密钥.pem和证书.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

第二步:从 .p12 密钥文件创建 .pem 格式密钥文件
openssl pkcs12 -nocerts -out apns-pro-key.pem -in apns-pro-key.p12

第三步(可选):如果要去除在第二步中要求的密码
openssl rsa -in apns-pro-key.pem -out apns-pro-key-noenc.pem

第四步:现在需要将密钥 .pem 文件和证书 .pem 文件合并以获取用于应用程序生产阶段推送通知所需的生产 .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

第五步:检查证书有效性和与 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


5
谢谢,这是唯一一个对我有用的。 - Erik Villegas
6
这个回答太棒了!我珍藏了它!:P - Blackening
3
你是一个神,这个方法很有效,谢谢你。点赞。这应该是最佳答案,因为它详细介绍了如何逐步创建它。 - MNM
2
当然应该接受这个答案,因为@Rahul Sharma的回答没有产生预期的结果,而这个答案是完美的。 - Nowdeen
2
对我来说,在第二步中实际输入密码是必要的。保持为空会创建一个PEM文件,但密钥的实际值为空,导致下一步出现错误。 - shadowhorst
显示剩余7条评论

65

步骤:

  1. 使用密钥链访问创建CSR。
  2. 使用私钥在密钥链访问中创建P12。
  3. APNS应用程序ID和证书

这将给您三个文件:

  • CSR
  • 作为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验证成功 输入PEM密码: 验证-输入PEM密码:

首先,您需要输入 .p12 文件的密码,以便 openssl 可以读取它。然后,您需要输入一个新的密码,该密码将用于加密 PEM 文件。对于本教程,我使用“pushchat”作为 PEM 密码。您应该选择更安全的选项。 注意:如果您不输入 PEM 密码,openssl 不会给出错误消息,但生成的 .pem 文件将不包含私钥。

最后,将证书和密钥合并到单个 .pem 文件中:

$ cat PushChatCert.pem PushChatKey.pem > ck.pem


24

打开终端应用程序,在提示符后输入以下命令

  openssl pkcs12 -in CertificateName.p12 -out CertificateName.pem -nodes

1
生成p12后,这应该是答案。 - Stone

9
- >> 苹果的官方教程 << - 是我找到的唯一可行的指导。它非常简单明了,我可以确认它在linux php服务器和windows php服务器上都运行得很出色。
您可以在页面底部找到他们的五步PEM创建过程。

是的!只需按照简单的教程操作。只需要一个简单的openssl命令。我不知道这是否重要,但我通过SSH登录到连接到APNS的服务器上运行了该命令。 - tylerl
1
@tylerl,PEM 可以从任何机器生成 - 不一定是它将驻留的服务器。 - capikaw
我需要在部署 PHP 代码的服务器上运行这个进程吗?还是我可以使用从我的 Mac 生成的 .pem 文件? - Jatin
5
链接已于2015年9月失效。 - Nicolas Miari
2
https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/AddingCapabilities/AddingCapabilities.html#//apple_ref/doc/uid/TP40012582-CH26-SW11 - Angad

7

注意:您必须在App Store Connect中拥有团队代理或管理员角色才能执行这些任务。如果您不是App Store Connect团队的一部分,则可能不会受到影响。

向iOS应用程序发送推送通知需要创建加密密钥。过去,这是一个繁琐的过程,使用SSL密钥和证书。每个SSL证书都专门用于单个iOS应用程序。2016年,苹果推出了一种新的身份验证密钥机制,更可靠且易于使用。新的身份验证密钥更灵活,易于维护,并适用于多个iOS应用程序。

尽管身份验证密钥已经推出多年,但并不是所有服务都支持它们。FireBase和Amazon Pinpoint支持身份验证密钥。Amazon SNS、Urban Airship、Twilio和LeanPlum则不支持。许多开源软件包尚未支持身份验证密钥。

要创建所需的SSL证书并将其导出为包含公钥和私钥的PEM文件,请执行以下操作:

  1. 导航至证书、标识符和配置文件
  2. 创建或编辑您的App ID。
  3. 为App ID启用推送通知
  4. 向App ID添加SSL证书
  5. 将证书转换为PEM格式

如果你已经在Apple Developer Center网站上为应用程序设置了SSL证书,那么你可以跳过下一步到转换证书为PEM格式。 请记住,如果你不同时拥有在Mac上生成签名请求并上传到苹果公司的私钥,你将会遇到问题。

继续阅读以了解如何避免丢失该私钥。

导航到证书、标识符和配置文件

Xcode不控制推送通知的证书或密钥。要为应用程序创建密钥并启用推送通知,你必须前往苹果开发者中心网站。你账户下的“证书、标识符和配置文件”部分控制应用程序ID和证书。

要访问证书和配置文件,你必须拥有付费的苹果开发者计划成员资格或是参与该计划的团队成员之一。

  1. 登录Apple开发者网站enter image description here
  2. 进入账户,然后进入证书、标识符和配置文件enter image description here

创建应用程序 ID

使用推送通知的应用程序不能使用通配符应用程序 ID 或配置文件。每个应用程序都需要在 Apple 开发中心门户网站上设置一个应用程序 ID 记录,以启用推送通知。

  1. 进入Identifiers下的App IDs
  2. 使用bundle identifier搜索您的应用程序。 它可能已经存在。
  3. 如果没有现有的应用程序ID,请单击(+)按钮创建它。
  4. App ID后缀部分中选择Explicit App IDenter image description here
  5. 输入应用程序的bundle identifier。
  6. 滚动到底部并启用Push Notificationsenter image description here
  7. 点击Continue
  8. 在下一个屏幕上,单击Register以完成创建App ID。 enter image description here

为应用程序ID启用推送通知

  1. 进入标识符下的应用程序ID
  2. 单击应用程序ID以查看详细信息并向下滚动。 在此输入图像描述
  3. 单击编辑 在此输入图像描述
  4. 在应用程序ID设置屏幕中向下滚动到推送通知 在此输入图像描述
  5. 选中复选框以启用推送通知。 在此输入图像描述
创建推送通知的SSL证书是一个包含多个任务的过程,每个任务都有多个步骤。所有这些步骤都需要完成,才能将密钥以P12或PEM格式导出。在继续之前,请先查看这些步骤。

向App ID添加SSL证书

  1. 在开发SSL证书下点击创建证书。稍后您还需要为生产环境执行此操作。
  2. 苹果公司会要求您创建一个证书签名请求 enter image description here

要创建证书,您需要在Mac上制作证书签名请求(CSR),并将其上传到Apple。

稍后,如果您需要将此证书导出为pkcs12(又称p12)文件,则需要使用相同的Mac上的钥匙串。当创建签名请求时,钥匙串访问会在默认钥匙串中生成一组密钥。这些密钥对于处理苹果公司从签名请求创建的证书是必需的。

这是一个好习惯,专门为开发凭证创建一个单独的钥匙串。如果您这样做,请确保在使用证书助手之前将此钥匙串设置为默认值。
创建用于开发凭证的钥匙串:
1. 在 Mac 上打开钥匙串访问。 2. 在“文件”菜单中选择“新建钥匙串…”。 3. 给您的钥匙串起一个描述性名称,例如“共享开发”或应用程序名称。
创建证书签名请求(CSR):
在创建证书签名请求时,证书助手会在默认钥匙串中生成两个加密密钥。重要的是要将开发钥匙串设置为默认值,以便密钥位于正确的钥匙串中。
  1. 在您的Mac上打开钥匙串访问。
  2. 在钥匙串列表中,对开发钥匙串进行控制+单击。
  3. 选择使密钥串“共享开发”默认 enter image description here
  4. 钥匙串访问菜单中选择证书助手,然后从子菜单中选择向证书颁发机构请求证书…enter image description here
  5. 当证书助手出现时,请勾选保存到磁盘enter image description here
  6. 用户电子邮件地址字段中输入与您的Apple开发者计划成员资格相关联的电子邮件地址。
  7. 通用名称字段中为密钥输入一个名称。使用应用程序的捆绑标识作为通用名称的一部分是个好主意。这样可以轻松地区分属于哪个应用程序的证书和密钥。
  8. 点击继续。证书助手将提示将签名请求保存到文件中。
  9. 在钥匙串访问中再次将“登录”密钥串设为默认。
创建签名请求会生成一对密钥。在上传签名请求之前,请验证开发密钥链是否具有这些密钥。它们的名称将与签名请求中使用的通用名称相同。

enter image description here

上传证书签名请求(CSR)

一旦创建了证书签名请求,请将其上传到Apple开发者中心。Apple将从签名请求创建推送通知证书。

  1. 上传证书签名请求
  2. 从证书签名请求中下载Apple创建的证书 enter image description here
  3. 在钥匙串访问中,从关键链列表中选择开发关键链
  4. 文件菜单中选择导入项目... enter image description here
  5. 导入从Apple下载的证书文件

现在,在钥匙串访问中,您的开发关键链应该显示带有私钥的推送证书在我的证书下:

enter image description here

在此时,开发钥匙串应该备份。许多团队将其推送证书保存在安全的USB驱动器上,提交到内部版本控制或使用像Time Machine这样的备份解决方案。开发钥匙串可以在不包含任何个人代码签名凭据的情况下在不同团队成员之间共享。
引用块: 密钥链文件位于~/Library/Keychains中。
一些第三方推送服务需要以隐私增强邮件(PEM)格式的证书,而其他服务则需要公钥密码学标准#12(PKCS12或P12)。从Apple下载的证书可以用于导出这些格式的证书-但仅当您保留了私钥时才能使用。
将证书转换为PEM格式
  1. 在钥匙串访问中选择之前创建的开发钥匙串。
  2. 我的证书中选择推送证书。它应该带有一个私钥。 ![下载CER推送证书](keychain/import complete.png)
  3. 文件菜单中选择导出项目... enter image description here
  4. 在打开的保存面板中,将隐私增强邮件(.pem)作为文件格式。
  5. 保存文件

1
大多数答案中的截图。 - mfaani
你是否缺少截图?请查看答案末尾的“下载CER推送证书”。 - mfaani
我在我的钥匙串中拥有证书和私钥,但将其导出为.pem文件的选项已被禁用。我只能将其导出为.p12.cer,适用于我拥有的所有3个沙盒证书+密钥。我甚至创建了一个新的沙盒证书,但仍然无法导出.pem文件。有任何想法吗? - mfaani

5

2

在安装OpenSSL之后,我是在Windows 7上完成的(链接指向Win32安装程序,请选择最新版本而不是轻量级版本)。

使用此方法,您只需要从Apple下载.cer文件。

c:\OpenSSL-Win32\bin\openssl.exe x509 -in aps_development.cer -inform DER -out developer_identity.pem -outform PEM

这将创建一个文件,然后您需要将您的私钥添加到其中。

-----BEGIN PRIVATE KEY-----
MIIEuwIBADANBgkqhk....etc
MIIEuwIBADANBgkqhk....etc
MIIEuwIBADANBgkqhk....etc
MIIEuwIBADANBgkqhk....etc
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
AwIBAgwIBADAwIBADA....etc
AwIBAgwIBADAwIBADA....etc
AwIBAgwIBADAwIBADA....etc
-----END CERTIFICATE-----

就是这样。

2

如果您已经在钥匙串访问中有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,否则您需要输入您的文件名。谢谢!


2
我建议使用更简单的解决方案。只需使用Certifire
Certifire是一款macOS应用程序,可以在几秒钟内仅需一次点击即可生成Apple推送通知证书。
以下是步骤:
1. 下载该应用程序。
2. 使用您的Apple开发人员帐户凭据登录。
3. 选择App-ID。
4. 点击“生成”按钮。
5. 完成!
您将获得以.pem格式和.p12格式为APN证书。 更重要的是,您还将获得组合的.pem和.p12(密钥+证书)!
此外,您还将获得所有这些证书的无密码版本!

enter image description here

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接