HTTPS 的 7 个误解

误解七:HTTPS 无法缓存

许多人以为,出于安全考虑,浏览器不会在本地保存 HTTPS 缓存。实际上,只要在 HTTP 头中使用特定命令,HTTPS 是可以缓存的。 微软的 IE 项目经理 Eric Lawrence 写道:

“说来也许令人震惊,只要 HTTP 头允许这样做,所有版本的 IE 都缓存 HTTPS 内容。比如,如果头命令是 Cache-Control: max-age=600,那么这个网页就将被 IE 缓存 10 分钟。IE 的缓存策略,与是否使用 HTTPS 协议无关。(其他浏览器在这方面的行为不一致,取决于你使用的版本,所以这里不加以讨论。)”

Firefox 默认只在内存中缓存 HTTPS。但是,只要头命令中有 Cache-Control: Public,缓存就会被写到硬盘上。下面的图片显示,Firefox 的硬盘缓存中有 HTTPS 内容,头命令正是 Cache-Control:Public。

误解六:SSL 证书很贵

如果你在网上搜一下,就会发现很多便宜的 SSL 证书,大概 10 美元一年,这和一个.com 域名的年费差不多。而且事实上,还能找到免费的 SSL 证书。 在效力上,便宜的证书当然会比大机构颁发的证书差一点,但是几乎所有的主流浏览器都接受这些证书。  

误解五:HTTPS 站点必须有独享的 IP 地址

由于 IPv4 将要分配完毕,所以很多人关心这个问题。每个 IP 地址只能安装一张 SSL 证书,这是毫无疑问的。但是,如果你使用子域名通配符 SSL 证书(wildcard SSL certificate,价格大约是每年 125 美元),就能在一个 IP 地址上部署多个 HTTPS 子域名。比如,https://www.httpwatch.com 和 https://store.httpwatch.com,就共享同一个 IP 地址。

另外,UCC(统一通信证书,Unified Communications Certificate)支持一张证书同时匹配多个站点,可以是完全不同的域名。SNI(服务器名称指示,Server Name Indication)允许一个 IP 地址上多个域名安装多张证书。服务器端,Apache 和 Nginx 支持该技术,IIS 不支持;客户端,IE 7+、Firefox 2.0+、Chrome 6+、Safari 2.1 + 和 Opera 8.0 + 支持。  

误解四:转移服务器时要购买新证书

部署 SSL 证书,需要这样几步:

  1. 在你的服务器上,生成一个 CSR 文件(SSL 证书请求文件,SSL Certificate Signing Request)。
  2. 使用 CSR 文件,购买 SSL 证书。 3. 安装 SSL 证书。

这些步骤都经过精心设计,保证传输的安全,防止有人截取或非法获得证书。结果就是,你在第二步得到的证书不能用在另一台服务器上。如果你需要这样做,就必须以其他格式输出证书。 比如,IIS 的做法是生成一个可以转移的.pfx 文件,并加以密码保护。

将这个文件传入其他服务器,将可以继续使用原来的 SSL 证书了。  

误解三:HTTPS 太慢

使用 HTTPS 不会使你的网站变得更快(实际上有可能,请看下文),但是有一些技巧可以大大减少额外开销。 首先,只要压缩文本内容,就会降低解码耗用的 CPU 资源。不过,对于当代 CPU 来说,这点开销不值一提。 其次,建立 HTTPS 连接,要求额外的 TCP 往返,因此会新增一些发送和接收的字节。但是,从下图可以看到,新增的字节是很少的。

第一次打开网页的时候,HTTPS 协议会比 HTTP 协议慢一点,这是因为读取和验证 SSL 证书的时间。下面是一张 HTTP 网页打开时间的瀑布图。

同一张网页使用 HTTPS 协议之后,打开时间变长了。 建立连接的部分,大约慢了 10%。但是,一旦有效的 HTTPS 连接建立起来,再刷新网页,两种协议几乎没有区别。先是 HTTP 协议的刷新表现:

然后是 HTTPS 协议:

某些用户可能发现,HTTPS 比 HTTP 更快一点。这会发生在一些大公司的内部局域网,因为通常情况下,公司的网关会截取并分析所有的网络通信。但是,当它遇到 HTTPS 连接时,它就只能直接放行,因为 HTTPS 无法被解读。正是因为少了这个解读的过程,所以 HTTPS 变得比较快。  

误解二:有了 HTTPS,Cookie 和查询字符串就安全了

虽然无法直接从 HTTPS 数据中读取 Cookie 和查询字符串,但是你仍然需要使它们的值变得难以预测。 比如,曾经有一家英国银行,直接使用顺序排列的数值表示 session id:

黑客可以先注册一个账户,找到这个 cookie,看到这个值的表示方法。然后,改动 cookie,从而劫持其他人的 session id。至于查询字符串,也可以通过类似方式泄漏。  

误解一:只有注册登录页,才需要 HTTPS

这种想法很普遍。人们觉得,HTTPS 可以保护用户的密码,此外就不需要了。Firefox 浏览器新插件 Firesheep,证明了这种想法是错的。我们可以看到,在 Twitter 和 Facebook 上,劫持其他人的 session 是非常容易的。 咖啡馆的免费 WiFi,就是一个很理想的劫持环境,因为两个原因:

  1. 这种 WiFi 通常不会加密,所以很容易监控所有流量。
  2. WiFi 通常使用 NAT 进行外网和内网的地址转换,所有内网客户端都共享一个外网地址。这意味着,被劫持的 session,看上去很像来自原来的登录者。

以 Twitter 为例,它的登录页使用了 HTTPS,但是登录以后,其他页面就变成了 HTTP。这时,它的 cookie 里的 session 值就暴露了。

也就是说,这些 cookie 是在 HTTPS 环境下建立的,但是却在 HTTP 环境下传输。如果有人劫持到这些 cookie,那他就能以你的身份在 Twitter 上发言了。 (完)  

来自:阮一峰的网络日志
译者:阮一峰 ****
链接:http://www.ruanyifeng.com/blog/2011/02/seven\_myths\_about_https.html
原文:http://blog.httpwatch.com/2011/01/28/top-7-myths-about-https/