什么是.p8扩展名的文件? (APNs Auth Key / JWT)

时间:2018-03-16 17:07:00

标签: ios certificate apple-push-notifications

我认为这有点荒谬,但很难找到有关这个文件的信息。我已经找到了很多关于如何获得此Apple Push Notification Authentication Key的信息,但我也想确切地知道它是什么。
以下是我发现的一些信息:

优点:

  • 无需每年重新生成推送证书;
  • 一个验证密钥 可用于您的所有应用;
  • 沙盒和制作相同。

来自Apple Docs

  

基于令牌的提供者连接信任:使用该提供者的提供者   基于HTTP / 2的API可以使用JSON Web令牌(JWT)来提供验证   与APN连接的凭据。在此方案中,您提供了一个   Apple保留的公钥以及您保留的私钥   并保护。然后,您的提供商使用您的私钥生成和   签署JWT提供程序身份验证令牌。你的每一个推动   通知请求必须包含提供者身份验证令牌。

     

您可以在提供商和。之间使用单个基于令牌的连接   APN可以向所有应用程序发送推送通知请求   捆绑包ID列在您的在线开发者帐户中。

     

每个推送通知请求都会产生HTTP / 2响应   APN,向您的提供商返回成功或失败的详细信息。   进一步检查基于令牌的Provider-to-APNs Trust 部分。

问题:

  • 实际上是什么.p8文件?
  • 什么程序可以打开它? (Keychain对我不起作用)
  • 有没有办法将其转换为.pem.p12
  • 为了不创建新主题,有一个小小的问题:服务器端是否可以像.p12一样使用.p8运行,还是应该添加其他工具?

3 个答案:

答案 0 :(得分:2)

文件扩展名只是一种惯例,但很可能.p8扩展名用于表示它是PKCS#8 PrivateKeyInfo(或EncryptedPrivateKeyInfo)。

我希望Keychain程序能够将它作为“一把钥匙”打开,但我手边没有mac我不能说。它应该以SecItemImportkSecFormatOpenSSLkSecItemTypePrivateKey)打开。

  

有没有办法将其转换为.pem或.p12?

假设你的意思是.pem的“证书”,没有。如果你的意思是PEM编码,当然。它取决于“BEGIN PRIVATE KEY”或“BEGIN ENCRYPTED PRIVATE KEY”。

从技术上讲,它也可以转换为PKCS#12。但Apple的PKCS#12导入器不会导入(最后我看到)私钥,它无法确定它们所属的证书(来自相同的PKCS#12)。

这只是一个私钥,没有证书(因此没有过期)。所以基于证书的方法没有意义。

  

服务器端是否可以像.p12一样使用.p8运行,还是应该添加其他工具?

这完全取决于协议的细节,我不知道。如果协议传输证书,那么转换涉及不同的机器。如果它只是传输签名而服务器查找公钥进行验证,则服务器端没有任何改变。

答案 1 :(得分:0)

这是一个文本文件! .p8扩展名表示包含公钥/私钥的简单文本文件。您可以使用任何文本编辑器(TextEdit,vim,Sublime Text)打开它以查看您的密钥。

答案 2 :(得分:0)

以下是我的研究状态:

APNS .p8文件包含私钥,该私钥用于 SIGN 用于APNS消息的JWT内容。 该文件本身是纯文本文件,其内部的KEY格式为PEM格式。

----- BEGIN PRIVATE KEY -----和----- END PRIVATE KEY -----之间的部分是密钥本身的base64格式的ASN.1 PKCS#8表示形式。有些人可以使用以下Web服务提取其内容(ASN1JS)。

KEY本身的长度为32个字节,用于为JWT创建所需的ECDSA P-256 SHA-256签名。生成的JWT看起来像这样的' {JWT标头base64编码}。{JWT有效载荷base64编码}。签名(64字节)base64编码'。

有许多Web服务可对此类令牌进行解码,但由于无法识别相应的PUBLIC KEY(Apple在提供PRIVATE KEY时将其保密),因此某些服务无法检查签名。

编辑:.PUBLIC KEY似乎也包含在.p8文件中,可以通过OpenSSL提取(在解码ASN.1内容:520位流时可见)。

  

openssl ec -in AuthKey_123ABC4567.p8 -pubout -out   AuthKey_123ABC4567_Public.p8