登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> SoftHub关联区 >> 主题: [苹果/ios/apns]苹果推送证书与 p12 格式转换为 pem 格式最全详解!     [回主站]     [分站链接]
[苹果/ios/apns]苹果推送证书与 p12 格式转换为 pem 格式最全详解!
clq
浏览(337) - 2019-11-01 16:10:31 发表 编辑

关键字: apns

[2019-11-01 16:59:48 最后更新]
[苹果/ios/apns]苹果推送证书与 p12 格式转换为 pem 格式最全详解!

又到了更新苹果推送证书的时候,一想到无数的步骤和苹果各种更新带来的坑我就不想动。
不过今天狠狠的花了一下午时候搞清楚了 p12 格式转换为 pem 的各种"秘密"(原理),还是很高兴的,总结下来其实这个证书更换还是很容易的。特此记录,您看过之后一定会我和有同样的感觉 :)

这里先跳过申请的坑(我另外再开帖子说),这里只关注证书下来后怎样转换成我们程序中要用的 pem 格式。

----
1.
申请下来的证书应该是 cer 格式,一般名称就是 aps.cer
这个文件格式是怎样的不用管,在苹果操作系统中双击导入到“钥匙串访问”中。这时就可以在“钥匙串访问”中找到这个推送证书了。

2.
再下一步的操作,各种教程的说法大相径庭,有说一句话解决的,有说要好多步骤的。经过各种测试和各种痛苦的坑,我终于搞清楚了,其实这一步就是要将
“钥匙串访问”中的推送证书和推送证书对应的专用密钥(其实就是密码学中的私钥)都导出来,并且都要转换成我们程序能识别的 pem 格式。
所以第二步就是要先将二者导出为 p12 的格式,之所以要这样是因为苹果“钥匙串访问”不能直接导出 pem 的格式。至于有教程中要分别导证书和密钥,有些说只要导证书就行,其实这种区别是和苹果操作系统的版本有关的。在最新的版本中导出证书会同时导出对应的密钥,这就是为什么有些教程说一步就能搞定的原因。

那么怎么知道自己的导出包含了两部分还是一部分呢。具体我们后面再说,简单说就是先转换成 pem 再看 pem 的源码,直接看 p12 格式可能也有对应的软件吧,不过目前所知的情况是不能直接从导出的 p12 中看出来。

3.
导出的 p12 转换为 pem 后就可以用了,不过一般这种导出的 pem 会含有密码,对于像我这样使用 golang 语言的人来说还是不能直接用,要再转换成无密码(其实是不加密)的 pem 格式才行。

4.
调用一些 openssl 的测试命令来尝试连接苹果推送服务器。

5.有些教程还有合并的命令,其实不一定需要。而且需要合并的话其实也不一定需要用命令的方式。
-----

下面详解各个步骤的坑和原理,如果照网上的教程,一步错就可能让你无所适从,而按苹果这种玩命升级的做法,这种可能性是很高的。
这里有个很重要的问题就是这些教程大部分都是使用苹果操作系统自带的 openssl 来进行转换的,我记得是在网站可以直接转换的,所以知道其他转换方法的其实也不一定非要用 openssl 。也是因为这个原因,大家操作失败也很有可能是因为 openssl 的版本差异导致的。

----
以一句话解决的教程为例子,命令行为
openssl pkcs12 -in Certificates.p12 -out Certificates.pem -nodes

不懂它里面的原理是很容易失败的。首先这种方法成功的前提1是:这个导出的 p12 格式文件中包括了证书和私钥匙两部分才行。前提2是:这个版本的 openssl 的 -nodes 参数工作正常,后面我们详细说参数变化了怎么处理。
首先判断证书中是否包含了两个部分的方法是,直接使用一个纯文本编辑器打开 pem 文件,有 "-----BEGIN CERTIFICATE-----" 字样就是含有了证书部分,有"-----BEGIN PRIVATE KEY-----"字样就是有了私钥的部分。
如果您的证书中只有一样或者是两个都没有那是肯定会失败的。

--------------------------------------------------
有可能失败的转换语句
openssl pkcs12 -nocerts -out key.pem -in key.p12

失败的原因可能是 -nocerts 参数在您的 openssl 版本上不正常,其实完全可以不用这个参数,这个参数只是说在转换时不要转换证书而已。其实同时转换也没什么要紧的,加了这个参数反而会导致私钥部分也没转换出来,得到一个空的 pem 文件。所以转换后最好看一下 pem 结果的源码。

----
如果需要对key不进行加密:
openssl rsa -in key.pem -out key.unencrypted.pem

这在对转换出来的空 pem 时会报错。如果不确定是否成功,最好不要调用这个命令,直接用前面提到的 -nodes 那句话。我觉得要使用这个命令的唯一情况就是 -nodes 失效时不得已再用。

----
合并 pem 文件的命令教程很可能会说是
cat cert.pem key.unencrypted.pem > ck.pem

这个命令出错的可能性倒是很小,因为这是 linux 的基本命令,苹果操作系统也是天然支持的。不过对于同时导出两部分的文件来说也是没有必要的,能不用就不用。实在要用说一下原理好了,就是将两个文件直接合并,与格式什么的完全无关。对于 pem 文件,甚至哪个文件在前哪个在后其实都是可以识别出来的,因为它们就是字符串分隔的文本文件而已。

----
测试成功的命令
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert cert.pem -key key.pem

其实没有什么必要,如果 pem 文件有问题,在各种转换命令中就会报出了。这个命令的意思是连接苹果服务器试一下,其实倒了不一定能成功。既然是更新那么我们手头上肯定有能用的系统,直接替换生成的 pem 文件试一下就行了。

--------------------------------------------------
最后总结,直接用
openssl pkcs12 -in x.p12 -out x.pem

转换就行了,如果环境不能放密码的就加 -nodes 去掉密码好了。
如果是导出的 p12 含有一部分,那就分别导出证书和密码都执行一次这个命令就好了。没有必要按有些教程说的对证书和密码还要使用不同的命令。多加出来的命令不过是要去掉其他部分罢了 -- 如果有其他部分,那对于我们的 apns 来说就是包含了证书的密钥根本没有必要去掉。






总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1