【问题标题】:What is the file with .p8 extension? (APNs Auth Key / JWT).p8 扩展名的文件是什么? (APNs 认证密钥/JWT)
【发布时间】:2018-08-25 20:06:50
【问题描述】:
我认为这有点荒谬,但很难找到有关此文件是什么的信息。我找到了很多关于如何获得这个Apple Push Notification Authentication Key 的信息,但我也想知道它到底是什么。
这是我找到的一些信息:
好处:
- 无需每年重新生成推送证书;
- 一个授权密钥
可用于您的所有应用程序;
- 沙盒和生产环境相同。
来自Apple Docs:
基于令牌的提供者连接信任:提供者使用
基于 HTTP/2 的 API 可以使用 JSON Web 令牌 (JWT) 来提供验证
与 APNs 连接的凭据。在此方案中,您提供了一个
Apple 保留的公钥和您保留的私钥
和保护。然后,您的提供商使用您的私钥生成和
签署 JWT 提供者身份验证令牌。你的每一次推动
通知请求必须包含提供者身份验证令牌。
您可以在提供者和提供者之间使用单一的、基于令牌的连接
APNs 可以向所有应用程序发送推送通知请求
捆绑包 ID 列在您的在线开发者帐户中。
每个推送通知请求都会产生一个 HTTP/2 响应
APN,将成功或失败的详细信息返回给您的提供商。
进一步检查Token-Based Provider-to-APNs Trust部分。
问题:
- .p8 文件实际上是什么?
- 什么程序可以打开它? (钥匙串对我不起作用)
- 有没有办法将其转换为
.pem 或.p12?
- 为了不创建新主题而提出一个小问题:服务器端使用 .p8 的操作方式是否与 .p12 相同,还是应该添加其他工具?
【问题讨论】:
标签:
ios
certificate
apple-push-notifications
【解决方案1】:
以下是我的研究状态:
APNS .p8 文件包含 PRIVATE KEY,用于签署 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 header base64 encoded}.{JWT payload base64 encoded}.Signature (64 bytes) base64 encoded'。
有很多 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
【解决方案2】:
文件扩展名只是一种约定,但很可能使用.p8 扩展名来表示它是 PKCS#8 PrivateKeyInfo(或 EncryptedPrivateKeyInfo)。
我希望 Keychain 程序能够将其作为“钥匙”打开,但我不能说手头没有 mac。它应该以SecItemImport(kSecFormatOpenSSL,kSecItemTypePrivateKey)打开。
有没有办法将其转换为 .pem 或 .p12?
假设您的意思是.pem 的“证书”,不。如果您的意思是 PEM 编码,当然可以。它是“BEGIN PRIVATE KEY”还是“BEGIN ENCRYPTED PRIVATE KEY”,具体取决于。
从技术上讲,它还可以转换为 PKCS#12。但是 Apple 的 PKCS#12 导入器不会导入(我上次看到的)私钥,它无法确定它们所属的证书(来自同一个 PKCS#12)。
这只是一个私钥,没有证书(因此没有过期)。所以基于证书的方法没有意义。
服务器端是否可以像 .p12 一样使用 .p8 操作,还是应该添加额外的工具?
这完全取决于协议的细节,我不知道。如果协议传输证书,则转换涉及不同的机器。如果它只是传输一个签名并且服务器查找公钥进行验证,那么服务器端没有任何改变。
【解决方案3】:
这是一个文本文件! .p8 扩展名表示包含公钥/私钥的简单文本文件。您可以使用任何文本编辑器(TextEdit、vim、Sublime Text)打开它以查看您的密钥。