苹果和谷歌监控你的所有推送通知。但自 2017 年起,Tuta 就能保护您免受其害。

我们要阻止谷歌和苹果等公司的监控行为。因此,我们用自己的通知系统取代了谷歌的 FCM,并将苹果通知数据保持在最低水平。请继续阅读,了解这一点的重要性。

2023-12-07 / First published: 2020-01-30
当我们在 2017 年重新设计 Tuta 客户端时,我们严格专注于将所有人从被迫使用谷歌服务中解放出来的使命。现在,新的证据表明这是一个极好的举措,因为谷歌和苹果监控着你的所有推送通知。因此,我们还在 F-Droid 上发布了我们的安卓应用程序,使其成为为数不多的不使用谷歌推送通知服务的电子邮件应用程序之一。这是一个真正的挑战,让我们来解释一下我们是如何成功的。

让每个人都能离开 Gmail

我们使用 Tuta 的目的是让每个人都能转用一个尊重您的数据和隐私权的安全电子邮件服务。让每个人都能完全离开 Gmail对我们来说非常重要。

因此,在从头开始重建我们的安全邮件应用程序时,摆脱谷歌的推送通知服务是我们的首要任务。我们很高兴能成功取代谷歌的 GCM 进行推送,从而使 Tuta 应用程序与谷歌实现零连接。这将保护您免受谷歌庞大的广告跟踪生态系统以及政府的无证窥探。

现在,新的证据表明,这种先发制人的转变是保护个人隐私的重要一步。Tuta 是唯一一家提供这种隐私保护的加密电子邮件提供商,即使是安全的替代产品 Protonmail也没有采取这种额外的措施。

苹果和谷歌监控你的所有推送通知

路透社于 2023 年 12 月 7 日披露了令人震惊的消息,有证据表明世界各国政府正在通过监控发送到苹果和谷歌用户设备上的推送通知来监视他们。在美国参议员罗恩-怀登(Ron Wyden)致美国司法部的一封公开信发布后,这种另类的监控方式首次引起了公众的注意。

这些通知允许情报和执法机构将已经收集到的元数据与谷歌或苹果账户联系起来。

Tuta 早在几年前就已意识到这一潜在风险,并于 2017 年用自己的推送通知服务完全取代了谷歌的通知服务。如果您在安卓系统上使用 Tuta,推送通知数据不会与谷歌共享。我们保证您的隐私安全。

我们还支持通过 F-Droid 在安卓设备上安装 Tuta 应用程序,这样您就可以在不向谷歌提供您正在使用该软件的提示的情况下使用该软件。通过 F-Droid 安装 Tuta,您的推送通知也不会受到这种形式的数据收集和监控。

在苹果设备上,我们尚未推出自己的推送通知服务,但计划在未来发布。目前,iOS 设备上的所有推送通知只显示最低限度的信息,通知您有新邮件到达,以限制政府监控企图可能收集的数据。

我们如何替换 GCM

GCM(或现在的叫法,FCM,Firebase Cloud Messaging)是谷歌旗下的一项服务。我们在 Tuta 的旧版 Android 应用程序中使用了 FCM。不幸的是,FCM 包含谷歌用于分析的跟踪代码,我们不想在我们的安全应用程序中使用这些代码。

更重要的是为了使用 FCM,您必须将所有通知数据发送给谷歌。你还必须使用他们的专有库。出于对隐私和安全的考虑,我们在使用旧版应用程序时没有在发送通知信息时一并发送任何信息(这导致了用户的投诉,这是可以理解的)。因此,旧版应用程序中的推送通知只提及您收到了新邮件,而没有提及邮件本身或邮件所在的邮箱。

FCM 的使用非常方便,多年来,谷歌对安卓系统进行了改动,这使得不使用它们的通知服务变得更加困难。另一方面,放弃谷歌的通知服务可以让我们不必要求用户在他们的手机上安装谷歌播放服务。

取代谷歌 FCM 的挑战

Tuta 应用程序是 Libre 软件,我们希望为Gmail 提供一个真正的开源替代方案,其中包括在 F-Droid 上发布我们的 Android 应用程序。我们希望用户能在每个 ROM 和每个设备上使用 Tuta,而不受 Google 等第三方服务的干扰。

我们决定接受挑战,建立自己的推送通知服务。

开始设计推送系统时,我们有几个目标:

  • 必须安全
  • 必须快速
  • 必须省电

我们研究了其他公司(Signal、Wire、Conversations、Riot、Facebook、Mastodon)是如何解决类似问题的。我们想到了几种方案,包括 WebSockets、MQTT、服务器发送事件和 HTTP/2 服务器推送。

用 SSE 取代 FCM

我们最终选择了 SSE(服务器发送事件),因为它似乎是一个简单的解决方案。我的意思是 "易于实现,易于调试"。调试这类东西是一件非常头疼的事情,所以我们不能低估这个因素。另一个支持 SSE 的理由是相对能效:我们不需要上游信息,与服务器保持持续连接也不是我们的目标。

那么,什么是 SSE?

SSE 是一种网络应用程序接口,允许服务器向连接的客户端发送事件。在我看来,这是一个相对古老的应用程序接口,但却没有得到充分利用。在研究联盟网络 Mastodon 之前,我从未听说过 SSE:他们使用 SSE 进行实时时间轴更新,效果非常好。

协议本身非常简单,类似于老式的轮询:客户端打开一个连接,服务器保持打开状态。与传统轮询不同的是,我们会为多个事件保持开放连接。服务器可以发送事件和数据信息;它们只是用新的行隔开。因此,客户端唯一需要做的就是打开一个超时较多的连接,并循环读取数据流。

SSE 比 WebSocket 更符合我们的需求(因为它不是双工的,所以成本更低,收敛更快)。我们见过多个聊天应用尝试使用 WebSocket 进行推送通知,但似乎并不省电。

我们对 WebSocket 已经有了一些经验,而且我们知道防火墙不喜欢保持连接。为了解决这个问题,我们对 SSE 采用了与 WebSocket 相同的解决方法:我们每隔几分钟发送一次 "心跳 "空信息。我们在服务器端调整了这一间隔时间,并进行了随机调整,以避免服务器不堪重负。

多账户支持带来额外挑战

值得注意的是,Tuta 应用程序支持多账户,这给我们带来了挑战:我们希望每台设备只打开一个连接。经过几次反复,我们找到了令我们满意的设计。每台设备只有一个标识符。打开连接时,客户端会发送想要接收通知的用户列表。服务器会根据用户记录验证该列表,并过滤掉无效记录。

用户可以从 "设置 "中删除通知标记,但这不会影响该设备上的其他登录。除此之外,我们还必须在收到通知时建立交付跟踪机制。不幸的是,我们发现服务器无法检测连接是否中断,因此我们不得不从客户端发送确认信息。

为了接收通知,我们利用了 Android 的功能。我们运行一个后台服务,保持与服务器的连接畅通,这与 FCM 进程的功能类似。另一个困难是 Android M 引入的 "打盹 "模式造成的。"打盹 "模式在一段时间不活动后开启,除其他外,会阻止后台进程访问网络。可以想象,这将导致我们的应用程序无法接收通知。

我们通过要求用户为我们的应用程序免除电池优化来缓解这一问题。效果相当不错。与 Doze 无关的类似问题是供应商特定的电池优化。为了延长设备的电池寿命,手机制造商(如小米)会默认启用严格的电池优化。幸运的是,用户可以禁用它们,但我们必须更好地宣传这一点。

另一个问题是 Android O 的变化造成的。其中之一就是后台进程限制:除非用户能看到您的应用程序,否则您的后台进程将被停止,而且您无法启动新进程。

起初,我们认为可以通过显示优先级最低的持续通知来解决这个问题,该通知在通知沟槽中可见,但不在状态栏中显示。但这在奥利奥版中行不通:如果你尝试启动后台服务并为其通知使用最低优先级,通知优先级就会升级到更高优先级(一直可见),除此之外,系统还会显示另一个持续性通知:"应用程序 X 正在使用电池"。

我们最初计划向用户解释如何隐藏这些持续性通知,但这并不是一个很好的用户体验,因此我们必须找到一个更好的解决方案。我们利用 Android 作业机制定期(至少每 15 分钟)启动我们的服务,并尝试在启动后保持其活力。我们不需要手动保持唤醒锁,而是由系统代劳。我们可以完全放弃持续通知。即使通知有时会有少许延迟,但我们总能及时收到通知和电子邮件。

最后,我们不得不做一些工作,但这是完全值得的。我们将用户从 Google Play 服务要求中解放出来。最后,每个人都能在 F-Droid 上使用 Tuta 应用程序。现在,该系统兼具高效能和高速度。

最后的想法每个用户都能为每个应用程序选择 "通知提供商

如果用户只需在手机设置中选择一个 "推送通知提供商",操作系统就能自行管理所有这些繁琐的细节,岂不美哉?这样,每个不想被平台所有者监管的应用程序就不必重新发明系统了?可以在应用程序和应用程序服务器之间进行端到端加密。这在技术上并不困难,但只要我们的系统被大公司控制,他们不允许这样做,我们就必须自己解决这个问题。

为了建立一个自由开放的网络,我们必须停止向大公司提供我们所有的私人数据。这就是为什么我们要说#NoMoreGoogle