//www.greatytc.com/p/e759c864c2b8
P12证书直接生成
刚开始说需要pem证书时,我查到有好些说可以直接转化。在终端进入p12所在的文件夹,再用命令:
openssl pkcs12 -in 你的推送.p12 -out apns_production.pem -nodes
提示输入密码,输入p12的密码即可
注意:尾部的参数,如果只导出私钥可以加上 -nocerts 参数,只导出证书则可以加上 -nokeys 参数
我没条件抬头验证,我将pem给服务器后台,结果运行失败。因为我知道后台推送服务器存在着秘钥解析的问题。但是既然都可以验证pem证书,那么这样直接生成的pem也是正确的
证书和秘钥分开生成
如图把钥匙串中的推送证书找开,分别把证书,秘钥分别导出成生pem,最后合成
具体的生成流程:
1.先分别导出证书apns-dev-cert.p12和秘钥apns-dev-key.p12
2.把证书转成pem
openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
3.把秘钥转成pem
openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
这里需要输入三次密码
4.合成pem
cat apns-dev-cert.pem apns-dev-key.pem > apns.pem
详细参考 (证书的验证可以直接验证最后的合成证书)
5.注意
(1) 在第3点生成秘钥pem时总共是输了三次密码,第一次密码是key.p12的密码,第二次和第三次重复的密码是转成pem后必须需要的解析密码,两者密码是不一样的。但是是为了记忆,直接就输入同样的密码。
(2)在PHP的后台服务中,如果开发人员写得比较细,把证书pem和秘钥pem分开来进行的话,那你可以不用走第5步,直接把证书pem和秘钥pem给PHP开发人员就行了。
(3)如果后台服务器在使用时报错:failed to parse PKCSI private key。那说明我们第3步的这个密码错误。但是再想想,你生成这个pem,不可能不记清你的这个密码吧。所以了很大可能是后台解析时密码的输入代码有误。
很可怜的事就是我就遇到了无法检查原代码的情况。那怎么办了,我们的思维告诉我们,实在不行公钥pem不使用密码就多好的。可是我直接测试了一下,那里是公钥pem必须要密码,不然在进行抢着验证时是通不过的。请看第6条,补充方法
6.补充方法
我们可以给秘钥apns-dev-key.pem设置为无密码,将第3步生成的apns-dev-key.pem转成未加密的apns-dev-key-unencrypted.pem
openssl rsa -in apns-dev-key.pem -out apns-dev-key-unencrypted.pem
那么第4步合成的时候就用这个未加密的apns-dev-key-unencrypted.pem来合成
cat apns-dev-cert.pem apns-dev-key-unencrypted.pem > apns-dev.pem
我最后就是用这个方法解决了failed to parse PKCSI private key的问题。
验证证书
apns的推送服务器地址
开发环境:gateway.sandbox.push.apple.com:2195 生产环境:gateway.push.apple.com:2195
但是我惊奇的发现,不管是对于生产pem,还是测试pem,这两个网址都可以进行验证
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert apns.pem
openssl s_client -connect gateway.push.apple.com:2195 -cert apns-dev.pem
结果
x509 生成服务器所需证书pem或P12
基本流程:
1.利用“钥匙串”请求证书
2.创建证书,下载cer文件
3.双击安装下载的cer文件后,导出p12证书
4.利用命令行转换pem文件
5.如果需要转换为p12
6.验证证书是否可用
具体步骤:
1.利用钥匙串请求证书
Apple建议这样填写
保存,得到"CertificateSigningRequest.certSigningRequest"文件。这是请求所有证书的基础。
2.创建证书,下载cer文件
进入苹果开发者中心:https://developer.apple.com/cn/ Certificates, IDs & Profiles
创建 “iOS Development” 和 “iOS Distribution” 以及“Identifiers->App IDs”证书后,才可以创建推送证书。
创建方法类似,此处省略800字。
把做的证书下载下来。
分别得到发布开发cer和发布cer
"aps_development.cer" 和 "aps.cer"
3.双击安装下载的cer文件后,导出p12证书
分别导出开发证书和发布证书
"Apple Development IOS Push Services- com.in.inlan.p12" 和 "Apple Push Services- com.in.inlan.p12"
4.利用命令行转换pem文件
1). 先把下载下的cer转换为pem
$ openssl x509 -inform der -in aps_development.cer -out devPushChatCert.pem
$ openssl x509 -inform der -in aps.cer -out PushChatCert.pem
2). 将钥匙串中的p12转换成pem
$ openssl pkcs12 -nocerts -out devPushChatKey.pem -in Apple\ Development\ IOS\ Push\ Services-\ com.in.inlan.p12
$ openssl pkcs12 -nocerts -out PushChatKey.pem -in Apple\ Push\ Services-\ com.in.inlan.p12
3). 将上面生成的2中pem转为一个pem
$ cat devPushChatCert.pem devPushChatKey.pem > dev_ck.pem
$ cat PushChatCert.pem PushChatKey.pem > ck.pem
5.如果需要转换为p12
$ openssl pkcs12 -export -in dev_ck.pem -out dev_pushcer.p12
$ openssl pkcs12 -export -in ck.pem -out pushcer.p12
6.验证证书是否可用
整理有个写好的脚本可用(内部替换所需deviceToken即可)
Push Demo
https://iodefog.github.io/file/push.zip
$ php ios-push.php