为什么HTTP有时候比HTTPS要好?

做为一家安全公司,我们在站点Stormpath上经常被开发者问到的是有关安全方面最优做法的问题。其中一个被经常问到的问题是:

我是否应当在站点上运行HTTPS?

很不幸,查遍整个因特网,你大多数情况下会得到同样的建议:加密所有的东西!对所有站点进行SSL加密等等!然而,现实情况表明这通常不是一个好的建议。

许多情况下使用HTTP比使用HTTPS要好很多。事实上,HTTP是一个在性能上和可用性上比HTTPS更好的一种协议,这也就是我们经常推荐客户使用HTTP的原因。下面我们说一说我们的理由......

使用 HTTPS 会出现的问题

HTTPS 是一个错漏百出的协议. 此协议及其现今流行的实现中许许多多众所周知的问题使得它不适用于许多各种各样的web服务。

HTTPS 十分缓慢

为什么HTTP有时候比HTTPS要好?

应用 HTTPS 的主要阻碍之一就是 HTTPS 协议十分缓慢的这一事实。

就其特性而言,HTTPS 就是在两端之间进行安全的加密通信。这需要两端都持续耗费宝贵的CPU时间周期:

  • 一开始说“hello”就决定使用哪种类型的加密方式 (暗号方案套件)

  • 验证SSL证书

  • 为每一个请求的验证以及对请求/回应的验证核实,运行加密代码

为什么HTTP有时候比HTTPS要好?
leoxu
翻译于 2年前
1人顶
 翻译得不错哦!

而这听起来不是特别形象,其实就是加密代码运行的是CPU密集型的操作。它会重度使用浮点运算的CPU寄存器,会征用你的CPU从而使得请求的处理变慢。

这里有一个内容十分丰富的 ServerFault 线程,展示了在使用代用 Apache2 的一个 Ubuntu 服务器时,相比之下的处理速度你所能预计会有多大的降低:http://serverfault.com/questions/43692/how-much-of-a-performance-hit-for-https-vs-http-for-apache

如下是结果:

为什么HTTP有时候比HTTPS要好?

即使是像上面所展示的一个非常简单的示例,HTTPS也能将你的Web服务器的速度拖慢超过40倍! 这可拖了web性能很大的后腿.

在今天的环境中, 将你的应用程序作为 REST API 的一个组成部分来构建是很普遍的 — 使用 HTTPS 确实是会拖慢你的网站、影响你的应用程序性能并给你的服务器CPU带来不必要的冲击的一种方式,而且通常会惹恼你的用户。

对于许多对速度敏感的应用程序而言,使用原始的 HTTP 常常要好很多。

HTTPS 不是一个放之四海而皆准的安全保障

为什么HTTP有时候比HTTPS要好?

许多人都会抱有 HTTPS 会让他们的站点更安全,这样一种印象。这其实不是真的。

HTTPS 只是对你和服务器之间的流量进行了加密 — 一旦HTTPS信息的传输中断了,一切就又都是一场公平的游戏。

这意味着如果你的计算机已经感染的了恶意软件,或者你已经被受到欺骗运行了某些恶意软件 — 这个世界上所有的HTTPS对于你而言也都无能为力了。

此外,如果 HTTPS 服务器上存在任何的漏洞,某些攻击者就能够简单的等到 HTTPS 已经处理结束,然后再在其它的层(例如 web 服务这一层)抓取到不管什么数据。

SSL 证书本身也经常被滥用。比如,其在浏览器上的处理方式就很容易发生错误:

  • 每种浏览器(Mozilla,google 等)都是独立审计并核准根证书提供商来保证他们安全地处理SSL证书

  • 一旦核准通过,这些根 SSL 证书就会被添加到浏览器的可信证书列表,这意味任何由根证书提供商签名的证书都是默认可信的。

  • 这些提供商因此可随意乱搞,导致各类安全问题频发,比如2011年发生的 DigiNostar 事件。

以上种种,著名证书授权机构错误地签名了大量的伪造和欺诈的证书,直接损害数以万计的Mozilla用户的安全。

而 HTTP 并没有提供任何形式的加密服务,至少你知道你正在处理什么东西。

HTTPS流量很容易被监听

如果你正在构建一个需要被不安全的设备(比如移动 app)使用的 web 服务,你可能觉得因为你的服务运行于 HTTPS 上,通信就不会被监听了。

如果真这么想的话,你就错了。

其他人可以轻松地在电脑上设置代理来截获并查看HTTPS流量,也就越过了SSL证书检查,这就直接泄漏了你的私人信息。

这篇博文就演示了移动设备上的 https 消息监听。

你觉得没多大事?别做梦了!就连Uber这种大公司的移动应用都被逆向了,它们也用了 HTTPS。如果你灰心了,我劝你还是别看这篇文章了。

好了,接受现实吧,不管你怎么做,攻击者都能用这样或那样的方法来监听你的网络流量。与其把时间浪费在修复 SSL 的问题上,还不如花点时间想想如何明智地使用 HTTP 吧。

HTTPS 有漏洞

大家都知道 HTTPS 并不是铁板一块。多年来 HTTPS 被曝出了不少漏洞:

以后的攻击会越来越多。再加上 NSA 为了解密,正不遗余力地收集着 SSL 流量——使用 HTTPS 似乎一点用处都没有,因为不定什么时候你的 HTTPS 流量就会被一览无余。

HTTPS 太贵

最后要说的一点是 HTTPS 太贵了。你需要从根证书颁发机构购买浏览器和客户端能够识别的 SSL 证书。

这可不便宜啊。

SSL 证书年费从几美刀到几千不等——如果你正在构建基于多个微服务(multiple microservices)的分布式应用,你需要买的证书可不只一个。

对于小项目或预算紧张的人来说成本一下子就抬高了不少。

为什么 HTTP 是一个不错的选择

在另一方面,让我们稍稍不那么消极片刻,而是专注于积极的东西 : 是什么使得HTTP很棒的。大多数开发者并不欣赏它的好处。

正确条件下的安全

当然HTTP本身没有提供任何安全性,通过正确的设置你的基础设施和网络,你可以避免几乎所有的安全问题。

首先,对于所有的你可能会用到的内部HTTP服务, 要确保你的网络是私有的,不能从公共的外部环境嗅探到数据包. 这意味着你将可能徐昂要将你的HTTP服务部署在一个像Amazon EC2这样的非常安全的网络里面.

通过在 EC2 部署公共的云服务器,就能保证你拥有一流的网络安全, 防止任何其他的AWS用户嗅探到你的网络流量.

使用 HTTP 的不安全性来扩展

人们过多的关注于 HTTP 缺乏安全和加密特点的时候,许多人没有想到的是,这种协议可以提供很好的扩展性。

大部分现代的Web应用程序通过队列来扩展。

你有一个Web服务器接受请求,然后用处在相同网络上的服务器集群运行单独的jobs来处理更多的CPU和内存密集型任务。

为了处理任务的排队,人们通常使用一个诸如 RabbitMQ or Redis 这样的系统。两个都是不错的选择,但是否可以除了你的网络外不使用任何基础设施组件而获得任务队列的好处呢?

使用HTTP,你可以!

它是这样工作的:

  • 建立Web服务器和所有处理服务器共享子网的一个网络。

  • 让你的处理服务器侦听网络上的所有数据包,和被动嗅探网络流量。

  • 当Web服务器收到HTTP流量,那些处理服务器可以简单地读取进来的请求(纯文本,因为HTTP不加密),并立即开始处理工作!

上述系统的工作原理就像一个分布式队列,快速,高效,简单。

使用 HTTPS,上述情况是不可能的,但是,通过使用 HTTP,可以大大加快您的应用程序同时去除(不必要的)基础设施--这是一个大的胜利。