为APNS创建.pem文件?


176

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


1
我可以使用.p12代替.pem进行apns吗?
— Gajendra K Chauhan

Fpe的.pem定义:serverfault.com/a/21158/193377单独的PEM并不是证书,它只是一种编码数据的方式。....粘贴到电子邮件正文中是安全的,因为它具有定位线并且是7位纯净的。
— AnneTheAgile

Answers:


364

这是我做的,来自:Joe Pezzillo撰写的blog.boxedice.com和“ iPhone Advanced Projects”第10章。

在钥匙串中使用aps_developer_identity.cer:

  1. 从本地Mac和登录钥匙串启动“钥匙串访问”,然后按“证书”类别进行过滤。您将看到一个名为“ Apple Development Push Services”的可扩展选项。
  2. 右键单击“ Apple Development Push Services”>导出“ Apple Development Push Services ID123”。将此apns-dev-cert.p12文件另存为可以访问的位置。无需输入密码。
  3. 下一条命令在Mac的Terminal中以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

12
在Mavericks(10.9's)的钥匙串访问中,有一个选项可以导出为.pem!只需右键单击“钥匙串访问”内的“ Apple Development / Production iOS推送服务”证书,然后选择“导出”即可。将文件格式更改为.pem-完成!还可以用作导出选项:.p7b和.p12
— tylerl

5
.pem已被我禁用,优胜美地beta7。我在创建.pem时遇到一些问题,当我打开.pem时,它说是分发而不是dev
— Cristi Băluță

2
.pem对我来说不是禁用的,但是我无法另存为p12。外观如下:i.imgur.com/U2M40dU.png
— FooBar 2015年

2
对于使用“钥匙串访问”应用程序的macOS 10.14 Mojave,您可以选择将“ Apple Push Services:com.yourBundleIdentifier证书”导出为文件格式“隐私增强邮件(.pem)”,并随时保存。
— 5uper_0leh 18/09/20

225

开发阶段:

步骤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,以获取App开发阶段中的推送通知所需的Development .pem。

如果执行了第三步,请运行:
cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem

如果未执行第三步,请运行:
cat apns-dev-cert.pem apns-dev-key.pem > apns-dev.pem

步骤5:检查证书有效性和与APNS的连接

如果执行了第三步,请运行:
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.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。

如果执行了第三步,请运行:
cat apns-pro-cert.pem apns-pro-key-noenc.pem > apns-pro.pem

如果未执行第三步,请运行:
cat apns-pro-cert.pem apns-pro-key.pem > apns-pro.pem

步骤5:检查证书有效性和与APNS的连接。

如果执行了第三步,请运行:
openssl s_client -connect gateway.push.apple.com:2195 -cert apns-pro-cert.pem -key apns-pro-key-noenc.pem

如果未执行第三步,请运行:
openssl s_client -connect gateway.push.apple.com:2195 -cert apns-pro-cert.pem -key apns-pro-key.pem


5
谢谢,这是这里唯一为我工作的人。
— Erik Villegas

6
将此保存在我的珍宝库中!:P有史以来最好的答案!
— 变黑

3
你是上帝,这行之有效,谢谢。上投票。这应该是答案,因为它深入介绍了如何逐步创建它
— -MNM

2
当然,这应该是可以接受的答案,因为@Rahul Sharma的答案没有产生预期的结果,而这个答案是完美的。
— Nowdeen

谢谢您节省了我的时间来检查证书的有效性。这应该是公认的答案@Biranchi
— Sharma

59

脚步:

  1. 使用钥匙串访问创建CSR
  2. 使用私钥使用钥匙串访问创建P12
  3. 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


22

启动终端应用程序,并在提示符后输入以下命令

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

1
生成p12后,这应该是答案。
— 斯通

10

->> 苹果自己的教程 <<-是我遇到的唯一可行的指令集。很简单,我可以确认它在linux php服务器和Windows php服务器上都能出色地工作。

您可以在页面底部找到其5个步骤的pem创建过程。


是! 只需遵循简单的教程即可。只是一个简单的openssl命令。我不知道这是否重要,但是我通过SSH将命令运行到连接到APNS的服务器中。
— tylerl 2014年

1
@ tylerl,PEM可以从任何计算机生成-不必是它将驻留在其中的服务器。
— capikaw 2014年

我是否需要在部署php代码的服务器上运行此过程?还是可以使用从Mac生成的.pem文件?
— 贾汀,2015年

4
链接已于2015
— Nicolas Miari



3

我建议一个更简单的解决方案。只需使用Certifire即可。
Certifire是一个macOS应用程序,只需几秒钟即可单击一次生成Apple Push Notification Certificates。

步骤如下:
1.下载应用程序。
2.使用您的Apple开发者帐户凭据登录。
3.选择应用程序
ID。4.单击“生成”按钮
。5.完成!

您将获得.pem格式以及.p12格式的APN证书。甚至,您还将获得.pem和.p12的组合(密钥+证书)!
此外,您还将获得所有这些证书的无密码版本!

在此处输入图片说明

在此处输入图片说明


3

注意:您必须在App Store Connect中具有Team Agent或Admin角色才能执行以下任何任务。如果您不属于App Store Connect中的团队,则这可能不会影响您。

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

尽管引入认证密钥已经有好几年了,但并不是每个服务都支持它们。FireBase和Amazon Pinpoint支持身份验证密钥。Amazon SNS,Urban Airship,Twilio和LeanPlum没有。许多开源软件包尚不支持身份验证密钥。

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

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

如果您已经在Apple Developer Center网站上为该应用程序设置了SSL证书,则可以跳过以将证书转换为PEM格式。请记住,如果您还没有在创建用于上传到Apple的签名请求的Mac上生成的私钥,则会遇到问题。

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

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

Xcode不控制用于推送通知的证书或密钥。要创建按键并为应用程序启用推送通知,您必须访问Apple Developer Center网站。帐户的“证书,标识符和配置文件”部分控制应用程序ID和证书。

要访问证书和个人资料,您必须具有付费的Apple Developer Program会员资格或成为该团队的成员。

  1. 登录到Apple Developer网站 在此处输入图片说明
  2. 转到帐户,然后转到证书,标识符和配置文件 在此处输入图片说明

创建一个应用ID

使用推送通知的应用程序不能使用通配符应用程序ID或供应配置文件。每个应用程序都要求您在Apple Developer Center门户中设置一个应用程序ID记录,以启用推送通知。

  1. 转到应用ID下的标识符
  2. 使用包标识符搜索您的应用。它可能已经存在。
  3. 如果该应用程序没有现有的应用程序ID,请单击(+)按钮创建它。
  4. 在“ 应用程序ID后缀”部分中选择“ 显式应用程序ID”。 在此处输入图片说明
  5. 输入应用程序的捆绑包标识符。
  6. 滚动到底部并启用“ 推送通知”。 在此处输入图片说明
  7. 点击继续。
  8. 在下一个屏幕上,单击注册以完成创建应用程序ID。 在此处输入图片说明

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

  1. 转到应用ID下的标识符
  2. 单击应用程序ID以查看详细信息并滚动到底部。 在此处输入图片说明
  3. 点击编辑 在此处输入图片说明
  4. 在“ App ID设置”屏幕中,向下滚动到“ 推送通知” 在此处输入图片说明
  5. 选中复选框以启用推送通知。 在此处输入图片说明

为推送通知创建SSL证书是一个完成多个任务的过程。每个任务都有几个步骤。所有这些都是导出P12或PEM格式的密钥所必需的。在继续之前,请查看步骤。

将SSL证书添加到应用ID

  1. 在“开发SSL证书”下,单击“ 创建证书”。您稍后也需要在生产中执行此操作。
  2. 苹果会要求您创建证书签名请求 在此处输入图片说明

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

以后,如果您需要将此证书导出为pkcs12(aka p12)文件,则需要使用同一Mac上的钥匙串。创建签名请求后,“钥匙串访问”会在默认钥匙串中生成一组钥匙。这些密钥对于使用Apple将根据签名请求创建的证书是必需的。

最好有一个单独的钥匙串,专门用于开发的凭据。如果这样做,请在使用证书助手之前确保将此钥匙串设置为默认值。

创建开发凭证的钥匙串

  1. 在Mac上打开钥匙串访问
  2. 在文件菜单中,选择新建钥匙串...。
  3. 给您的钥匙串起一个描述性名称,例如“ Shared Development”或您的应用程序名称

创建证书签名请求(CSR)

创建证书签名请求时,证书助手会在默认钥匙串中生成两个加密密钥。重要的是将开发钥匙串设为默认钥匙串,以使钥匙位于正确的钥匙串中。

  1. 在Mac上打开“钥匙串访问”。
  2. 在钥匙串列表中按住Control键并单击开发钥匙串
  3. 选择将钥匙串设为“共享开发”默认 在此处输入图片说明
  4. 从“ 钥匙串访问”菜单中选择“ 证书助手”,然后从子菜单中选择“ 从证书颁发机构...中请求证书”。 在此处输入图片说明
  5. 当出现证书助手时,请选中“ 保存到磁盘”。 在此处输入图片说明
  6. 在“ 用户电子邮件地址”字段中输入与您的Apple Developer Program成员资格关联的电子邮件地址。
  7. 在“ 通用名称”字段中输入密钥的名称。最好将应用程序的捆绑软件ID用作通用名称的一部分。这样可以轻松分辨出哪些证书和密钥属于哪个应用程序。
  8. 单击继续。证书助手将提示将签名请求保存到文件中。
  9. 在“钥匙串访问”中,再次将“登录”钥匙串设为默认值。

创建签名请求会生成一对密钥。在上传签名请求之前,请验证开发钥匙串是否具有密钥。它们的名称将与签名请求中使用的通用名称相同。

在此处输入图片说明

上载证书签名请求(CSR)

创建Certicate签名请求后,将其上传到Apple开发人员中心。Apple将根据签名请求创建推送通知证书。

  1. 上载证书签名请求
  2. 从证书签名请求中下载Apple创建的证书 在此处输入图片说明
  3. 在“钥匙串访问”中,从钥匙串列表中选择开发钥匙串。
  4. 从文件菜单中选择导入项目... 在此处输入图片说明
  5. 导入从Apple下载的证书文件

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

在此处输入图片说明

此时,应该备份开发钥匙串。许多团队将推送证书保存在安全的USB驱动器上,致力于内部版本控制或使用Time Machine等备份解决方案。开发钥匙串可以在不同的团队成员之间共享,因为它不包含任何个人代码签名凭据。

钥匙串文件位于中~/Library/Keychains。

一些第三方推送服务要求使用“隐私增强邮件”(PEM)格式的证书,而其他一些则要求使用“公共密钥密码学标准#12”(PKCS12或P12)。从Apple下载的证书可以用于导出这些格式的证书-但前提是您保留私钥。

将证书转换为PEM格式

  1. 在“钥匙串访问”中,选择之前创建的开发钥匙串。
  2. 在“ 我的证书”中选择推送证书。应该有一个私钥。![下载CER推送证书](keychain / import complete.png)
  3. 从文件菜单中选择导出项目... 在此处输入图片说明
  4. 在打开的保存面板中,选择“ 隐私增强邮件(.pem)”作为文件格式。
  5. 保存文件

2

这是我在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

这将创建一个文件,然后您还需要添加私钥。

----- BEGIN PRIVATE KEY -----
MIIEuwIBADANBgkqhk ....等
MIIEuwIBADANBgkqhk ....等
MIIEuwIBADANBgkqhk ....等
MIIEuwIBADANBgkqhk ....等
----- END PRIVATE KEY -----
----- BEGIN证书-----
AwIBAgwIBADAwIBADA .... etc
AwIBAgwIBADAwIBADA .... etc
AwIBAgwIBADAwIBADA .... etc
-----结束证书-----

而已。


1

我从不记得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>?)中。创建文件后,执行a chmod +x signpem.sh使它可执行,然后可以运行:

~/signpem myCertificate.p12 myCertificate.pem

而myCertificate.pem将被创建。


1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.