iOS 应用创建APNS 和 VOIP的pem证书流程

时间:2024-04-05 13:04:14

早期的极光推送和友盟推送也是需要上传pem文件的,不过可能对接入SDK的开发者来说,要用一堆的命令生成pem文件还是有些太麻烦了,所以现在都改成了上传p12文件,输入密码的形式,这样极大的简化了开发人员使用SDK的流程。

因为服务器端是自己实现的APNS和VOIP,所以每次给客户部署服务器后,对应的App都需要生成新的pem证书给服务器端,这里记录下创建pem文件的流程。

1.创建CertificateSigningRequest.certSigningRequest证书

打开Mac中的钥匙串应用,【证书助理】–> 【从证书颁发机构请求证书…】。
iOS 应用创建APNS 和 VOIP的pem证书流程

接下来,填入【邮箱】,选择保存到【磁盘】即可。

这样,CertificateSigningRequest.certSigningRequest文件就创建好了。

2.创建APNS用的cer证书

开发者中心创建好应用的appId(也就是应用的bundleId)后,就可以创建apns证书了。

这里要分别创建Development和Production证书,需要选择先选择对应的appId,然后上传上一步中的CertificateSigningRequest.certSigningRequest文件即可。

创建完成后,分别下载APNS的Development和Production证书,下载后的默认名称是aps_development.ceraps.cer

然后,分别双击aps_development.ceraps.cer,这两个证书就被安装到钥匙串中了。

aps_development.ceraps.cer证书,先不要删除,后面测试推送会用到。

3.生成服务器推送用的pem文件

3.1 导出p12文件

先将证书从钥匙串中导出p12文件。

如果最终开发证书和发布证书都要生成pem文件的话,那么开发证书和对应的key,以及发布证书和对应的key都要分别导出成p12文件。

我这里拿production证书举例,先导出证书(注意这里是选中证书):
iOS 应用创建APNS 和 VOIP的pem证书流程

导出的时候要设置密码,这里一般都随便设置一个(我这里设置的是123)。

然后,再导出key:
iOS 应用创建APNS 和 VOIP的pem证书流程
导出的时候要设置密码(我这里设置的是123)。

3.2 生成pem文件

可以先将导出的两个p12文件,放到一个文件夹下。然后,终端 中cd 到该目录下。
iOS 应用创建APNS 和 VOIP的pem证书流程

3.2.1 创建cert的pem文件

命令的格式如下:

openssl pkcs12 -clcerts -nokeys -out 证书.pem -in 证书.p12

这里的证书就是导出来的证书的名称。

示例命令:

openssl pkcs12 -clcerts -nokeys -out apns_amac_cert.pem -in apns_amac_cert.p12

执行完后,会要求输入密码,输入(导出p12证书时的密码,我这里是123)密码回车即可。

创建成功的话,命令行会有如下返回:

MAC verified OK

3.2.2 创建key的pem文件

命令的格式如下:

openssl pkcs12 -nocerts -out 私钥.pem -in 私钥.p12

这里的私钥就是导出的p12 key的名称。

我这里执行的命令:

openssl pkcs12 -nocerts -out apns_amac_key.pem -in apns_amac_key.p12

执行完后,会要求输入密码,输入(导出p12证书时的密码,我这里是123)密码回车。

创建成功的话,命令行会有如下返回:

MAC verified OK

接下来,还要再输入两次密码,这两次是为key 生成的pem 设置密码,且密码要保持一致。

为key创建不需要密码的pem

服务端做推送时,无法输入密码,所以一般都是创建不需要密码的pem。

执行如下命令,可以为key生成一个去除密码的pem。

openssl rsa -in apns_amac_key.pem -out apns_amac_key_nopwd.pem

执行完上述命令时,依然需要输入密码,这里输入的就是上面key.pem的密码。

完成时,命令行会返回如下信息:

writing RSA key

3.2.3 合成服务器用的pem

执行命令将证书的pem 和key的pem合成到一起:
命令的格式如下:

cat 证书.pem 私钥.pem > 合成.pem

这里我执行的命令如下:

cat apns_amac_cert.pem apns_amac_key_nopwd.pem > apns_amac.pem

当然,如果想要创建的是带密码的pem,则使用带密码的key.pem即可。

比如:

cat apns_amac_cert.pem apns_amac_key.pem > apns_amac.pem

我们将合成后的pem给服务器端即可。

3.3 验证pem文件

可以使用如下命令来验证pem文件是否正确:

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert apns_amac_cert.pem -key apns_amac_key.pem

如果服务器端返回如下信息,表明pem有效:

SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : DES-CBC3-SHA
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: AF11044D4BEDCD4D75C36229C88A5475620326F661813FC56D11C62E08CDD43ABD681CC48AF16E04A5D252E9D4EC3869
    Start Time: 1554188821
    Timeout   : 300 (sec)
    Verify return code: 0 (ok

注意:其实苹果的APNS推送服务器有两个地址,gateway.sandbox.push.apple.com:2195是测试环境服务器;gateway.push.apple.com:2195是生产环境服务器。不管用哪一个服务器都可以测试pem证书。

3.4 验证pem文件

如果想要自己在本地,给手机发送APNS推送等消息,测试cer证书是否正确的话,可以使用这个工具:
SmartPush(同事在原工具的基础上做了一些修改),原始的工具是GitHub这里:https://github.com/shaojiankui/SmartPush
iOS 应用创建APNS 和 VOIP的pem证书流程

将证书(上面步骤2中下载的cer证书)和token设置好后,先【连接服务器】,再【推送】。