如何为多个iPhone应用使用唯一的pem文件进行推送通知

3
我正在创建一个应用程序,类似于一个模板,在此模板中,每个服务提供商都可以在Web设置中输入其详细信息,并更改应用程序名称、应用程序图标、新的包标识符并将应用程序上传到应用商店。到目前为止,一切都很好,但是对我来说存在问题,因为这个应用程序中有推送通知服务。
我已经阅读了苹果文档,其中指出每个包标识符都应包含唯一的推送证书。我们需要从中创建一个.pem文件,这意味着每个应用程序都将有一个不同的.pem文件。
但我想要一个单独的.pem文件,可以适用于所有应用程序。请问有什么建议或正确的处理方式吗?
1个回答

4
很遗憾,目前苹果推送通知服务无法实现您所要求的功能。虽然您可以在 OpenSSL 中使用多个可选参数来生成一个证书签名请求(CSR),使用完全相同的密钥对,但根本问题来自于创建新的 APNS 证书的第一步中的“证书、标识符和配置文件”工具:
如补充说明文字所述:“请注意,只有具有特定 Bundle Identifier 的显式 App ID 才能用于创建 Push SSL 证书”,这意味着我们既不能为推送通知提供通配符 App ID,也不能指定“所有 App ID”。
如果我们暂时进入一个假设的世界,在那里,“您想使用哪个 App ID?”这个问题不存在,而是直接进入上传 CSR 的步骤,我们从 Apple 得到的证书将会完全满足您的需求——它将验证您用于构建 APNS 负载的服务器是合法属于您并被授权向 APNS 网关发送推送的。然而,它确实开启了一个重要的安全问题——如果您可以使用此服务器(或 APNS 术语中的“提供者”)向任何应用程序发送推送(只要您知道设备的 APNS 令牌),那么什么阻止您使用您的提供者向我的应用程序发送推送?或者如果我们反过来考虑这个问题——什么阻止我使用我的授权 APNS 提供者向您的应用程序发送推送通知?或向您的客户发送错误信息(例如“遗憾的是,MyApp 将关闭其业务并退出 App Store。MyApp 建议客户购买 CompetitorApp 以维护您的服务!”)。这是一个卑鄙、容易受骗的世界,我们幸运地没有生活在这样的世界中……
相反,苹果要求第三方开发人员选择一个 AppID,以便特定 APNS 证书的负载将被接受。即使我设法获得了您客户的应用程序设备令牌,我也没有您服务器的私钥,因此无法成功地向您的客户交付欺诈、垃圾邮件或其他恶意的 APNS 负载。
好的,我已经明白了!既然我不能为多个 App ID 使用单个证书,那么我能做些什么呢?
考虑到您的问题背景,似乎您已经付出了努力,使您的应用程序高度可配置。用你自己的话来说,“它就像一个模板”,这表明在您的应用程序的服务器端,您有一些机制可以识别哪个应用程序正在进行数据请求以及要发送回哪个提供程序的数据。您的APNS提供程序逻辑需要内置类似的智能。根据您当前的服务器端区分方式,您可能能够重用一些现有的逻辑;您是必须做出决定的人。本答案的其余部分将提供一种高层次的方法,介绍如何设置您的提供程序以满足APNS强制实施的每个应用程序一个.pem的要求。总的来说:
  • 在您的APNS提供程序上放置已签名的.pem文件的副本
  • 更新您的提供程序的“注册设备令牌”API,以接受设备令牌以及某种方式唯一地标识此令牌有效的应用程序(...也许只是App ID本身!)
  • 更新iOS应用程序,将其APNS设备令牌和该应用程序标识符传递给您的提供程序上最新更新的“注册设备令牌”API。
  • 更新您的提供程序逻辑以在向APNS网关传递有效载荷时使用正确的.pem。
  • 为了良好的流程,请确保您有更新或撤销应用程序的.pem、数据和相关令牌的程序。
对于您从模板创建的每个应用程序,您已经必须生成唯一的应用程序ID和应用程序商店分发配置文件。在进行此初始设置时,您还可以请求APNS证书,并将所有三个数据部分视为特定于应用程序的设置。将APNS证书安装到您的提供程序中,与其他应用程序的.pem文件一起,以便在发送APNS有效载荷到Apple时获取它。
如果您以前做过APNS工作,那么您知道您的提供程序负责跟踪特定于应用程序的设备推送令牌,生成和传输APNS有效载荷到Apple,并可选择使用来自APNS反馈API的信息。当您的应用程序连接到您的提供程序以注册其令牌时,您还需要知道该令牌有效的应用程序是哪一个,以便您可以选择正确的.pem文件发送APNS有效载荷。这是关键的;如果您没有一种方法来知道哪些令牌与哪些应用程序ID相关联,则将无法在有效载荷生成和调度期间选择正确的.pem文件。
更新和淘汰软件是所有软件的关键部分,但它并不总是得到应有的关注。确保您考虑了如何刷新.pem文件(每年在当前文件过期之前必须这样做),以及如何淘汰一个应用程序而不会干扰您的提供程序服务的其他应用程序。
每个问题的答案都非常依赖于你是如何设计你的应用程序、Xcode项目配置、服务器端技术和服务器端逻辑的各个组件。只有你或你的团队才能根据构成你的软件的细节做出正确的决策。祝好运,让我们知道进展情况。

值得注意的是,重复使用相同的公钥/私钥对会违反PKI的分区方面。如果您重复使用这些密钥对,并且任何一个应用程序被攻击,那么这种妥协将影响共享该密钥对的所有应用程序,并要求为每个应用程序重新发行证书。显然,这是不可取的,因此请确保为每个应用程序生成新的CSR,以帮助维护严格的PKI分区。 - Bryan Musial

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接