为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.