告别网络威胁,拥抱TLS加密

2017年4月21日更新:因StartCom和WoSign接连曝出证书签发丑闻,Mozilla, Apple和Google已经决定撤销对这两家CA厂商的信任。Alex Sky网站也于2016年8月31日全部改为Let’s Encrypt CA。使用StartSSL的站长应该尽快转用其他CA。

TLS has exactly one performance problem: it is not used widely enough.
Everything else can be optimized.
——摘自 istlsfastyet.com

好久没有写日志了,今天想聊聊网络安全,特别是Web安全。随着网络和移动技术的逐渐普及,越来越多的事情现在可以在网上进行。比如,我们在社交网站上发表各种各样的观点、喜好、地理位置,在购物网站上挑选物品,付费购买,在网上交电话费、水电费。个人信息与金钱交易充斥在网络的各个角落,而各种各样的网络攻击也随之而来。在各式各样的网络攻击中,有一类攻击因为门槛低、成功率高而呈现井喷态势,这就是会话劫持攻击。我曾在《WordPress建站心得(三)Web安全与隐私》一文中简单介绍这种攻击和防范,不过因为当时题目所限,没有进一步说明这种攻击对个人的影响。简单来说,会话劫持就是黑客将自己的电脑置于你与你所访问的网站中间,从而获得你与该网站的所有通讯内容,这个内容不仅包括你的cookie(也就是你和网站建立的临时信任关系),还甚至包括你登陆所使用的账户和密码。这是因为在传统的网络连接中,所有的内容都是明文传输的。所有你看到的网址开头为”http://”的网站(或未标注”https://”,如下图),你和它们的通讯都能被截获。这种攻击技术已经如此成熟,以至于完全没有技术支持的人,通过下载一些简单的软件,都能实现这种劫持。除了企业级WIFI和客户端隔离的内网环境外,所有其他网络环境都适合这种攻击。

non-tls

比如,如果你在公共场所使用WIFI刷微博,别有用心的人可以在一秒钟内获得你的cookie,直接登陆你的微博。

对付会话劫持的方法,最简单的就是采用TLS连接,也就是加密连接。这种连接方式最早在1995年采用,到现在已经经历了长足的发展,规范逐步完善。TLS有两大安全特性,一是身份验证,二是通讯加密。首先,采用TLS的网站,需要获得一个由权威可信机构颁发的数字证书来证明网站的身份,确保我们所访问的服务器是这个网站的服务器,而不是黑客建立的服务器。其次,采用TLS的网站和浏览器的通讯是被加密的,即使通讯被网络中间的电脑截获,其数据是不可读的,从而保证了个人隐私及机密数据的安全。判断一个网站是否采用TLS十分简单,看地址栏是否用”https://”开头,并且没有任何错误信息出现。一些浏览器则会用绿色或者一个锁头的标志来显示。下图就是一个合法的TLS网站。

tls-enabled

可以看到,网址前面用绿色的字标明https,并画上了绿色的锁头。如果域名是你期待访问的,那么你的访问是安全的。

某些网站的网址前面标有”https://”,但因为配置不当或者已经成为黑客的陷阱,其标识会有警告信息,如下图。

broken

warning

在这种情况下,你应该立刻离开该网站(P.S 唯品会这个TLS错误从建立就一直存在,到现在为止都没修复)。

还有一种情况时,网站开启了TLS,而你所访问的的确是那个网站,但网站上有一些资源,如图片等,并未采用TLS连接。在这种情况下,浏览器会给予警示,如下图。

mixed-content

目前不是所有网站都开启了TLS。事实上,在国内绝大多数的网站都未开启TLS。但大多数银行已经开启了TLS,起码在登陆页面,这是一个好的趋势。但鉴于TLS已经发布了将近20年,这样慢的普及速度仍然令人发指。

作为普通的用户,我们需要认准”https://”的标识,并学会在浏览器给出TLS警告时采取行动,避免陷入会话劫持的陷阱中。在大多数网站未升级TLS之前,避免在公共场所使用WIFI,如果需要使用,也一定要配合VPN等手段,保护信息安全。

(以下内容写给站长,普通用户可以忽略)

现如今一些国外的互联网巨头,如Google, Facebook, Apple, Microsoft等,已经为网站开启了TLS支持,用于保护用户的数据安全。反观国内的互联网企业,鲜有这样做的。百度虽然有TLS,但打开后是错误页面,而新浪微博、网易、搜狐等,更是完全不支持,更不要说数不清的论坛和小网站。这些网站对于会话劫持的防御是0。那么,启用TLS真的这么难吗?长期以来,让站长不启用TLS的原因(或者说借口)无非有以下几条:

  1. 买证书贵。目前购买一个VeriSign最高等级的数字证书,每年是1499美元,不到一万元人民币。这对于一个日均PV几个亿,年收入几百上千万的网站来说,不过是九牛一毛。更加便宜的选择比比皆是。我的个人网站使用的证书,一年的话费是——0元,免费的,一样有效。所以,证书并不贵。

  2. TLS增加网站压力。这个观点认为TLS握手需要额外的CPU运算,且通讯数据需要实时加密和解密。但是,现代硬件和软件的发展早就能毫不费力地处理加密与解密运算。正如一位Google员工所说:“SSL/TLS仅占用1%的CPU资源,每个连接仅占用不到10KB内存,并比非TLS连接仅多出2%的传输量。”由此看来,TLS并不会显著增加网站的压力。

  3. 客户端不支持。这个观点更加老旧。作为一个已经出现20年的协议,TLS早已经深入到互联网的血液里。几乎所有主流的浏览器,包括PC端和移动端,都支持TLS协议,并且大多数都支持最新的TLSv1.2规范。这个理由也是不成立的。

  4. TLS增加网络延时。这个问题的确存在,但对整体的用户体验影响不大。TLS的延时主要体现在最开始连接的时候,会多出一个ping值的时间,但连接建立后,就同一般的非TLS连接是一样的了。而且随着SPDY和QUIC协议的不断发展,TLS连接反而能利用最新的网络技术,优化传输方式,提升速度。

以上这四点理由(借口),都不足以让我们继续使用不安全且过时的HTTP连接。正如本文开头所说,TLS唯一的表现问题不是别的,而正是我们的实施太慢,其他的一切都可以优化。目前国内大多数网站不支持TLS,恐怕不是因为别的,正是因为缺乏起码的安全意识,认为TLS仅用于保护机密数据。殊不知在Web2.0和移动互联网时代,个人信息就是最宝贵、最需要保护的信息。尽管我的个人网站不涉及个人信息,但我仍然默认强制开启TLS,因为我相信网络应该是可信的。鉴于腾讯的微信公众平台在后台接口仅支持HTTP,我已经取消开放微信公众平台的接口。以下贴出Alex Sky的nginx TLS配置,仅供参考。个人网站的证书可以去Let’s Encrypt免费获得。Alex Sky的SSL得分如下。
alexsky-score


    # define ssl policy
    ssl on;
    ssl_certificate /path/to/cert/alexsky.pem;
    ssl_certificate_key /path/to/cert/key/alexsky.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "ECDH+aRSA+AESGCM ECDH+aRSA+SHA384 ECDH+aRSA+AES256+SHA ECDH+aRSA+AES128+SHA DH+aRSA+AES256+SHA";
    ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout  10m;
    ssl_dhparam /path/to/dhparam/dhparam.pem;
    spdy_headers_comp 6;

7 comments

  1. 一直在用ssl,无论怎么说安全第一。
    提醒博主至少附上一个联系方式呀,看了你的几个profile,一个email连接都没有呢。联系起来不方便呀。

Comments are closed.