为什么应用程序下载通常不通过 HTTPS 完成?

信息安全 tls http 正直
2021-08-10 09:37:46

我们都知道,每当我们收集密码或其他敏感信息时,我们都应该使用 SSL。SSL 提供了两个主要好处:

  • 加密:数据在传输过程中无法被中间人读取。
  • 防范 MITM 攻击:中间人不能假装自己是服务器,因为他们无法为服务器生成 CA 签名证书。

如果我正在下载一个应用程序,我可能会在某个时候运行它,甚至可能以 root 身份运行。一些程序将被签署,但许多没有。不应该通过 SSL 进行下载,以便我知道它在传输过程中没有被篡改吗?

如果有人窃取了我的密码,那就糟糕了。但如果有人在我的电脑上植入键盘记录器,那就更糟了。

4个回答

请注意,此答案在水平线下方的部分是在 2012 年写的,当时是问问题的时候。当时,只有一小部分网络使用 HTTPS。从那时起,大多数网络都切换到 HTTPS,所以简短的回答是“他们是”。这个答案仍然是相关的,因为它解释了 HTTPS 在应用程序下载的上下文中做什么和不安全。


因为 HTTPS 不太适合保护大型公共文件的下载。对于这个用例,它很慢而且没那么有用。除了无能或无意识之外,还有很多不使用 HTTPS 的原因。

HTTPS 并不能完全解决问题如果您直接从供应商的网站获取应用程序,HTTPS 确实可以确保应用程序的真实性。但是如果你从第三方获取你的应用程序(例如免费软件的镜像),HTTPS 只保护与第三方的连接。包签名方案效果更好:它可以保护整个链免受供应商的侵害。应用程序分发需要端到端保护,而 HTTPS 不提供

HTTPS 使用更多带宽如果不考虑缓存,每次下载的开销是最小的。这是“HTTPS 不会花费更多”的球形牛:如果您使用 SSL,则除了 SSL 端点之外,您无法缓存数据。应用程序下载在极端情况下是可缓存的:它们是许多人下载的大文件。

HTTPS 是矫枉过正应用程序下载的机密性很少成为问题,我们所需要的只是真实性。遗憾的是,HTTPS 在不提供机密性的情况下无法提供真实性。真实性与缓存兼容,但机密性不兼容。

HTTPS 需要服务器上的更多资源。Google 邮件将其降低到 1% 的开销和 2% 的带宽开销,但这是针对一个非常不同的用例。Gmail 前端服务器的作用不仅仅是盲目地提供文件;文件服务器首先不需要强大的 CPU(它非常受 IO 限制),因此开销可能要大得多。内存开销也是如此:首先,文件服务器每个会话只需要很少的内存,几乎所有内存都是磁盘缓存。降低资源使用量需要大量工作

HTTPS 不会帮助很多人有安全意识的人会检查供应商提供的散列(应该通过 HTTPS)。没有安全意识的人会愉快地点击“此连接不安全”消息(那里有太多配置错误的服务器,以至于许多用户被训练忽略 HTTPS 错误)。更不用说那些不应该授予证书的狡猾的 CA。


如果您想确保获得的是真正的应用程序,请检查其签名,或根据您通过签名(例如通过 HTTPS)获得的参考值检查其哈希值。

好的供应商可以自动完成。例如,Ubuntu 提供其安装媒体的 GPG 签名它还通过 HTTPS 提供哈希(遗憾的是,据我所知,没有从下载页面附近的任何地方链接)。之后,软件安装工具会自动检查软件包是否带有有效的签名。请参阅如何将 https 与 apt-get 一起使用?

注意:如果您直接从供应商处获取应用程序(而不是通过某些软件包存储库或应用程序市场),那么 HTTPS 确实提供了保护。因此,如果您是供应商,直接在您的网站上提供您的应用程序以供下载,请务必使用 HTTPS 保护它!

(更新:请注意,这个答案现在已经快十年了,不一定反映 2021 年的情况。即使我显然是自己写的,我也觉得阅读时代精神很有趣,所以我会把它留给后代。)

这与为什么并非所有登录提示都使用 https 的原因相同:人们太懒了,认为证书太贵,或者托管使用 https 收费更高。

真正的问题是为什么下载比登录表单更频繁地通过普通连接提供。我认为这主要是因为不自觉通常会提供校验和,但如果通过 http 发送它们是不安全的。我见过的校验和的一个很好的实现是它们被发布到 Twitter(它使用 https,并且可以合理地假设是不妥协的)。但是,我不知道有人检查过校验和,也许只有在软件没有运行的情况下。通常假定 TCP 会进行合理的错误检查。

当然,https 在服务器上比 http 更重。对于高流量的网站,这可能是一个原因。但话又说回来,高流量的网站也可以产生“高额资金”来为其融资。

可以说,当用户通过 Web 下载应用程序时,应用程序下载应该通过 HTTPS 进行,因为对于用户来说,这是最干净的用户体验,提供了他们可以理解的安全性。可以说,期望许多用户在下载之前检查地址栏中的绿光是现实的,但是(例如)期望他们计算哈希值并安全地检查它们是不合理的。

但是,出于多种可能的原因,这些应用程序下载通常不通过 HTTPS 提供:

  • 很好的理由:HTTPS 阻止了网络中的缓存。这可能会增加网络流量、服务器负载和客户端网络负载。

  • 不好的原因:人们错误地认为“HTTPS 很慢”(这是一个神话),因为使用 SSL 设置服务器需要额外的工作,因为他们依赖镜像并且镜像站点不使用 HTTPS,或者因为人们没有想到或不认为他们处于危险之中。对于广泛使用的软件,这些信念可能是短视的。显然,还有一些站点可能会使用负载均衡器或加速器,这些负载均衡器或加速器是脑残且无法正确理解 HTTPS,并且他们不想或负担不起设计可以正确使用 HTTPS 的正确部署。

一些应用程序分发站点确实使用 HTTPS。但很多人没有。

Firefox 是下载应用程序时默认不使用 HTTPS的应用程序的一个引人注目的示例(请参阅各种 Mozilla 镜像站点上的 Firefox 副本有多安全?)。

Windows 更新全部通过安全通道(类似于 HTTPS)完成。Linux 包管理器使用加密技术来保护他们下载的软件,但不是 HTTPS 本身。

大多数时候,应用程序会有 MD5sums 和 SHA1 sums。下载后,您需要将其检查到网站上显示的那个。如果你计算的那个是一样的,那就没有问题了。