使用TLS证书与使用认证令牌的iOS推送通知

22
3个回答

39

基于令牌的身份验证是较新的身份验证方式,它可以简化APNS身份验证。该方法基于你在苹果开发者账户上可以生成的公钥和私钥对。

以下是其更加简单的主要原因:

  • 相同的密钥可用于开发和生产应用程序,而使用基于证书的身份验证需要不同的证书。
  • 相同的密钥用于你在苹果开发者账户中引用的所有应用程序。基于证书的身份验证需要每个应用程序一个证书。
  • 该密钥不会过期,而证书会在一年左右后过期并需要更新。

关于APNS的信息来源,可参考2016 WWDC视频: https://developer.apple.com/videos/play/wwdc2016/724/


1
我是疯了还是新的基于令牌的方法似乎不太安全?无法区分生产和开发环境似乎是一个问题。 - Scorb

8

对于2020年,你只能真正使用“令牌”方法。旧方法是遗留的,他们可能会放弃它。

你的私钥将看起来像这样

let keystring = `-----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49Aas8d76as8das687asd687asd68as8brwUIWA46qcXis
zCu6dbd4s8d7b5s86gf98ugtr28re7089a7d6tbvpiiui524kyfpq9861eFJP7we
eE7rX4182609457ohgyj3lhgp98wfb698bfg69287f2k4htgwpo876grwo7XDklz
9fdg689d
-----END PRIVATE KEY-----`

你的密钥 ID将会长成这个样子

let keyId = "CTU7XXBPRH"

您的Apple团队ID是您通常的Apple团队ID,看起来像"YWD3UUTEWD"。
现在 - 谢天谢地 - 从您公司的Apple开发者网站帐户内获取私钥和密钥ID相对容易。
如果您想在AWS上的普通Node服务器上测试发送推送,我强烈推荐这个出色的新npm,APNS2 https://www.npmjs.com/package/apns2
let bn = new BasicNotification(deviceToken, 'Hello')

发送推送就这么简单。
提示: 不要忘记“开发/沙盒”推送仅在连接到您的 Mac/Xcode 的 iPhone 上有效!
  • 开发/沙盒推送 - 仅适用于通过 Xcode 运行的构建连接到您的 Mac 的 iPhone。
  • 生产 推送 - 它们与 TestFlight 构建完全正常地工作。
此外,不要忘记所谓的开发/沙盒推送通常存在问题。它们经常几个小时后才能到达,有时根本没有到达,而且在许多地区它们根本不能工作。
不要忘记,可以完全放心地使用“生产” 推送,只需使用 TestFlight 应用即可。
  1. 进行构建
  2. 将其推送到您的TestFlight帐户。像往常一样等待几分钟,直到构建完成,
  3. 从TestFlight安装到您的手机上
  4. 您现在将立即收到所有推送!

而如果你

  1. 进行构建
  2. 只需将其构建/运行到您的连接设备 iPhone上
  3. 您将不会收到任何推送。
  4. 确实可以获得所谓的“开发”推送,但它们经常非常不稳定。

(需要明确的是,在使用APNS2时,如果您确实想尝试“开发”推送,要订购“开发”推送,只需使用底部https://www.npmjs.com/package/apns2解释的额外代码行即可)


旧的方法被认为是遗留问题,他们可能会放弃它。您能否提供任何苹果公司官方公布此事的链接?根据苹果开发者文档,基于证书的身份验证仍然是一种有效的技术: https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_certificate-based_connection_to_apns - Giuseppe B

7

2021年,苹果的设置远程通知服务器状态

两种技术都有优缺点,因此请决定哪种技术最适合您的公司。

Fattie和Ika都表示TLS/基于证书的身份验证不如其他方式。Firebase中的项目UI也使用了一些我认为解释不清楚的语言:

建议使用auth密钥进行配置,因为它们是向iOS发送通知的更现代方法


证书认证的好处

  • 有限访问证书。 每个证书都与您开发者帐户和环境(开发/生产)中的一个应用程序绑定。这避免了把所有鸡蛋放在一个篮子里,如果您的令牌身份验证密钥被破解,威胁行为者可以向您所有的应用程序推送通知。
  • 更简单的提供方应用逻辑。 提供方(与APNs交互的服务)(可以是您自己的服务器或您使用的服务)只需使用TLS证书进行身份验证,而无需创建JWT、添加请求头或查找正确的应用程序ID。

令牌身份验证的好处

  • 更简单的设置过程:因为你只需要下载一个.p12文件并在应用中使用它。进入developer.apple.com,创建Push Notification Key。但是,你的应用程序必须每小时更新这些标记。创建用于TLS身份验证的.p12文件需要更多的工作。
  • 不会过期,所以你可以设置并忘记它。而TLS证书默认在1年后过期。

问题的核心在于安全与便利之间的权衡。

  • 便利性(使用令牌认证):创建一个密钥并忘记它(令牌认证)非常方便,您可以使用Firebase(或其他服务)实际上每小时更新令牌,因此您没有太多工作要做。
  • 安全性(使用TLS认证):您真的想在所有应用程序之间共享相同的密钥吗?如果您想限制推送通知服务提供者(例如Firebase、Ably、Pusher)的范围,但不信任给他们访问所有应用程序的权限。实际上,您可能只有一个应用程序,所以这并不重要。

这种甚至安全性是否重要,还是使用令牌认证更方便?我会说,在大多数情况下,选择令牌认证。


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