免费 HTTPS 证书-从 StartSSL 到 Let's Encrypt

在国内严峻的流量劫持情况下,为了避免网站、APP 中出现莫名其妙的广告,同时也为了保护用户隐私,从 HTTP 切换到 HTTPS 是很多网站不得不做出的选择。

随着技术的进步,还有一个同样重要的原因,那就是 HTTP/2 也建立在 SSL/TLS 基础之上,想充分利用 HTTP/2 的新特性也要求网站切换到 HTTPS。

从去年开始,我的个人站点就切换到了 HTTPS + HTTP/2 协议,通过 Nginx 实现协议切换是非常容易的事情,仅要求一个合法的证书即可完成配置。当时我选择的证书服务商是 StartCom,可以为有限个域名签发免费的有效期一年的 HTTPS 证书。虽然 HTTPS 增加了计算上的开销,但对于个人网站的流量来说,这点儿开销可以忽略不计了。

原来一直都好好的,前几天访问网站的时候,Chrome 忽然提示网站证书不可信任。想起来在公司听到的 Chrome 撤销对 Symantec 签发证书的信任,感觉不好!上网一搜,果然 Chrome 也撤销了对 StartCom 根证书和签发证书的信任:《Distrusting WoSign and StartCom Certificates》,而且快半年了。只是因为我的 Chrome 一直没升级到 56 版本以上,所以没有觉察到。于是没办法,只能寻找新的证书提供商了。

本来都打算花钱买个证书了,后来发现一个很值得信赖的证书提供商:Let’s Encrypt 。虽然是一个免费的服务,但后面有一堆知名组织和公司的支持:ISRG, Mozilla, Cisco, Chrome, Facebook 等,看起来比以前的一些免费证书服务靠谱多了,非常值得一用。

它家的证书有个局限,就是有效期只有 3 个月,然后就需要续签。这也很容易理解,一般免费都是有其它代价的。但是按照它给的安装步骤走下来,才发现它有着一套非常合理的设计。首先在你的服务器上安装一个软件 certbot,用参数指定你的网站根目录。这个证书机器人就会自动在你根目录下添加一个验证文件。远程证书服务器会访问你的网站,通过访问这个验证文件是否在你给定的域名路径下,自动验证你是否拥有域名的所有权。验证成功以后,证书就会自动签发到你服务器上的配置目录,只需要修改 Nginx 的配置,使用签发下来的证书就好了。

那每 3 个月的续签怎么办? certbot 本身就支持更新证书的参数,而且可以配置服务器自动重启的 hook,只需要把更新指令添加到服务器的 crontab,每 3 个月或者每 1 个月运行一次即可,完全不需要人工操作。

最后感叹一下,Apple 和 Google 真是互联网安全的业界良心!虽然看似专制霸道,但有多少 APP、网站是因为 Apple 的 App Transport Security 的要求才全站切 HTTPS 的?有多少证书提供商是因为 Chrome 时不时就吊销证书的行为才控制住了干坏事的冲动?真心希望中国的互联网大公司在此类事情上,不仅独善其身,也能兼济天下。

从安全的角度理解——为什么要使用 Google 的服务?

我很喜欢 Google 的一些服务 Gmail, Reader, Documents等等,而且我也一直大力倡导周围的人使用 Google 的服务。在我看到一些人仍在使用 163, sina 的信箱,抓虾的在线订阅器的时候,我不禁为他们通信的安全性担心。为什么使用 Google 的服务?一个很重要的原因是:因为它更安全。

目录:

1. 得到抓虾用户名密码的例子
2. 嗅探和可嗅探网络
3. 为什么 Google 更安全?
4. 为什么 163, sina, 抓虾 不安全?
5. 如何使用 Google 提供的安全服务?
6. 使用 Google 提供的安全服务的额外好处

1. 得到抓虾用户名密码的例子

首先,来看一个截图,看看国内某著名在线订阅器网站抓虾网对用户密码的保护有多脆弱:

Wireshark_Zhuaxia

请大家注意截图的最下方,能否看到这一行字:
email=solrex%40gmail.com&password=testtest&persistentCookie=true
solrex@gmail.com 是我在抓虾的注册帐号,而后面的 password 大家应该知道是什么东西吧!(不用试我的帐户,我的密码已经改了。)

有人会好奇这张截图怎么得到的,其实这是我在自己的电脑上用 Wireshark(一款著名的网络数据包分析软件,其前身是 Ethereal) 对通过我网卡的到抓虾网数据包进行监控的截图。Wireshark 实际上就是一款嗅探器,它能记录经过指定网络接口的所有数据包并进行分析。

2. 嗅探和可嗅探网络

为了解释如何才能得到上面的数据包,首先要介绍一下网络嗅探的原理:

嗅探,是一种黑客的窃听手段,一般是指使用嗅探器对数据流的数据截获。由以太网的知识我们知道,在以太网的冲突域中,每台主机的网卡都能接触到所有的数据包,如果数据包的目的地址是自己,网卡就接收数据包,并将包的内容向上层传递;如果数据包的目的地址不是自己,就将该包丢弃。那么如果网卡接收所有的数据包并对其进行分析呢?这就是所谓的“混杂模式”,将网卡设置为混杂模式后,就可以接收所有包,进而对同一网络中的其它主机的通信内容进行监听,这就是 Wireshark 进行嗅探的原理。

需要说明的一点是,在当前的网络下,直接进行嗅探并没有那么容易。上面所说的情况,只在以太网的冲突域中才能实现,而当前交换机的广泛使用,将冲突域限制到交换机和主机两点之间,除了自己没有其它主机,当然也无法直接对其它主机的通信内容进行监听。如果在交换网络下达到嗅探的目的,必须通过其它办法,比如 ARP 欺骗,这超出了本文的讨论范围,就不予介绍了。

虽然在交换网络下无法对其它主机进行直接嗅探,但是我们无法保证在我们的数据包经过的防火墙或者网关时候不会被监听。就比如在实验室的网络环境下,实验室的管理员在网络出口的防火墙处对数据包进行分析是易如反掌的事情。

所以我们总结一下,用户通信的数据包被监听可能发生在几种情形下:一、共享网络,网络用户通过集线器连接到网络;二、交换网络的结点不可信任,比如公司网络的出口防火墙管理员不可信;三、缺乏安全机制的无线网络,比如学校为学生提供的无线网络连接(用 WEP 加密传输的网络可以认为是缺乏安全机制);四、有ARP欺骗的交换网络。

由于很多网站的登录 session 是使用的 http 协议,在此协议下,用户名和密码都是通过明文传输的(抓虾和 sina 就是一个例子),所以当用户处在上述的网络环境下时,很有可能数据包被别人监听到。而数据包一旦被监听和分析,得到用户的信息易如反掌,南京大学小百合 BBS 最近的一篇文章:你还敢在教室中享受无线吗? ,就是一个很生动的例子。

3. 为什么 Google 更安全?

首先,因为 Google 采用了 https 协议来处理用户登录请求。https(Hypertext Transfer Protocol over Secure Socket Layer) 协议是指加强安全的 http 协议,正如它名字所示,它采用 SSL 来保证数据的加密传输。举个很有证明力的事实,如果你有任何一个银行的网上银行帐号,请打开你的网银登录窗口,查看上面的地址栏内容开头是不是:https://xxx.xxx.com/xxxx 。没有任何一家银行采用 http 协议处理网银登录请求,这说明了什么?http 协议不安全。

其次,因为 Google 使用可选的 https 协议来提供内容传输服务。虽然 Google 在其任何服务的登录请求处理中都是使用 https 协议,但是在认证完用户之后,和 Google 服务器的连接就转回到了 http 协议。这样虽然 Google 的用户名和密码不能被窃听到了,可服务的内容,比如 Gmail 邮件的邮件内容就会被恶意用户窃听到。那么如何使整个通信的内容都受到保护呢,就需要使用 Google 提供的可选 https 服务,只需要在你的浏览器地址栏内容的最前面 http:// 换成 https:// 即可。

4. 为什么 163, sina, 抓虾 不安全?

sina 和 抓虾 没有提供任何的帐户信息和内容的安全传输功能,所以在课堂上演示嗅探器工作方式的时候,演示者一般都会首先拿 sina 开刀,原因很简单,它是个大网站。

163 呢,比前面两个好一点儿,它提供了可选的帐户信息的加密传输功能,就是在登录 163 信箱的时候,在登录框下面有一个“增强安全性”的选项,如果勾选了增强安全性选项,163 就会用 https 来处理用户的登录请求。但是 163 仍然没有提供对用户内容的加密传输功能,即 163 的所有邮件在网络上都是明文传输

5. 如何使用 Google 提供的安全服务?

如果用户希望自己的帐户信息和传输内容都受到保护的话,那么就应该使用 Google 提供的 https 连接登录 Google 服务。比如Gmail 的 https 入口是:https://mail.google.com/ ,Google Reader 的 https 入口是:https://www.google.com/reader/ 。在 Google 其它的服务中,用户也可以简单地通过将地址栏的 http:// 换成 https:// 来选择使用安全传输。

6. 使用 Google 提供的安全服务的额外好处

使用安全的加密传输能保证自己传输的信息不被别人获取,这是显而易见的好处,但是使用 Google 的安全服务还有一点额外好处:避免自己的网络访问被关键词过滤。

有过访问敏感站点经验的同志可能都知道,如果网页中包含某些关键词,连接往往会被重置。就比如用户使用 Google Reader 订阅了某个激进的博客的RSS FEED,如果使用传统的 http 连接,当文章中包含敏感关键词时,Google Reader 就会与服务器断开连接。如果使用加密传输的话,传输内容就避免了被关键词过滤,就不会发生类似连接被重置的情况。