自蒂姆.博纳斯-李于 1989 年 3 月 12 日发明万维网以来,HTTP 也伴随其共同走过了整整 30 周年。随着网络的发展,今天的互联网早已不再是早期的“田园牧歌”时代。
互联网生态的“恶化”,对于现在非常普遍的网络购物,网上银行等需要高度信任的应用场景来说是非常致命的,然而即便是对于安全性不那么高的新闻、视频以及搜索等网站来说,由于互联网上的恶意用户、恶意代理,劫持等场景,导致各种利益损失。
然而这些仅凭 HTTP 自身的发展是无力解决的,需要引入新的机制/协议来解决这些问题,这就是 HTTPS。
HTTPS 的由来
由于 HTTP 天生“明文”的特点,整个传输过程完全透明,任何人都能够在链路中截获、修改或者伪造请求/响应报文,数据不具有可信性。简单点回答就是“因为 HTTP 不安全”。
- 数据的明文传送和消息完整性检测的缺乏,恰好是现代网络支付,网络交易等新兴应用中安全方面最需要关注的。
什么是安全
既然 HTTP “不安全”,那什么样的通信过程才是安全的呢?通常认为,如果通信过程具备了如下四个特性,都可以认为是“安全的”。
一说到数据安全,大家首先想到的肯定是加密,的确加密可以让数据成为“秘密”,这便是机密性;但是它并不能防止黑客对数据的替换或篡改,而完整性却可以保证这一点;然而缺少身份验证,即使数据保证了机密性和完整性,但是最后却发送给了“假冒者”。
通过前三个特性,为 Web 通信构建了一个安全的环境。可以解决安全通信的大部分问题,但如果缺少了不可否认,那通信事务的真实性就得不到保障,容易出现生活中人们口中的“老赖”。
所以,只有同时具备了机密性、完整性、身份认证和不可否认这四个特性,通信双方的利益才能有保障,才能算的上是真正的安全。
什么是 HTTPS
HTTPS(超文本传输安全协议,HyperText Transfer Protocol Secure)是利用 SSL/TLS 来加密数据包,进行网络安全通信的传输协议。所以又称为 HTTP over SSL/TLS。
1. 与 HTTP 的区别
HTTPS 的 RFC 规定了新的协议名为 “https”,默认端口号 443。其他的与 HTTP 在语法、语义上完全一样,优缺点也“照单全收”(当然要除去“明文”和“不安全”)。即除了协议名 “http” 和端口号 80 两点不同之外,其他没有任何区别。
2. 实现原理
那 HTTPS 是如何做到安全传输的呢?秘密就在于 HTTPS 名字里的 “S”,HTTPS 把下层的传输协议由 TCP/IP 换成了 SSL/TLS,由“HTTP over TCP/IP” 变成了 “HTTP over SSL/TLS”,让 HTTP 运行在了安全的 SSL/TLS 协议上,收发报文不再使用 Socket API,而是调用专门的安全接口。
HTTPS 本身并没有做什么“惊世骇俗”的事情,全是靠着下层的 SSL/TLS 来“撑腰”。所以只要理解了 SSL/TLS,HTTPS 自然就搞懂了。
SSL/TLS
SSL(Secure Sockets Layer)即安全套接层,最初于 1994 年由网景公司为了保障网上交易安全而开发的。在 OSI 参考模型的第 5 层(会话层), 这样在不影响上层协议情况下,能够保证上层协议的网络通信安全。
SSL 共发布 v2 和 v3 两个版本(因为 v1 存在严重的缺陷从未公开过),由于 v2 存在很多安全缺陷很快就被 v3 所取代,而 v3 也已经证明其自身是一个非常好的安全通信协议。
鉴于 SSL 协议是网景公司专有,于是 1999 年 IETF(互联网工程组)成立了一个小组专门负责将该协议标准化,改名为 TLS(传输层安全,Transport Layer Security)。
- 第一个标准化的 SSL 即 TLS 1.0,也就是 SSL 3.0 的升级版,该协议与 SSL 3.0 的区别并不特别明显,但是仅有的区别也严重妨碍了 TLS 1.0 与 SSL 3.0 之间的互操作性。
TLS 1.0 自 1999 年 1 月发布后,IETF 为解决发现的安全缺陷同时扩展协议的功能,截止目前又发布过三个新版本:2006 年 4 月发布了 TLS 1.1,2008 年 8 月发布了 TLS 1.2,和去年(2018)的 TLS 1.3。每个版本都紧跟密码学的发展和互联网的现状,持续强化安全和性能,已经成为信息安全领域中的权威标准。
- TLS 设计的初衷是在可靠的传输协议(TCP)之上运行。但是,有实现把它放到数据报协议(如 UDP)之上。例如 Google 在 2013 年实现的 QUIC 协议,也就是未来的 HTTP/3。
目前应用最广泛的仍然是 TLS 1.2,而之前的协议都已经被证实是不安全的。虽然 TLS 为网络通信带来安全,但是带来的代价也是不小的,它需要 2-RTT 的协商成本,在弱网下,网络连接的建立将会被进一步放大,同时后台服务解密的成本也十分高昂,在大型企业中需要单独的集群来做这个事情。
TLS 1.3
而在 2018 年发布的 TLS 1.3 在兼顾性能与安全的前提下,大幅度简化密码套件,把握手时间减少到 1-RTT,效率提高了一倍。不仅如此,TLS 1.3 还引入了 0-RTT 协商,在 TCP 连接后就可以立即建立安全连接并发送机密消息。
OpenSSL
说道 TLS,就不能不谈到 OpenSSL,它是一个著名的开源密码学程序库和工具包。几乎支持所有公开加密算法和协议,已经成为事实上的标准,许多应用软件都会使用它作为底层来实现 TLS 功能,包括常用的 Web 服务器 Apache、Nginx 等。
OpenSSL 计划开始于 1998 年,目标是发明一套自由的加密工具,在互联网上使用。最初基于另外一个开源库 SSLeay。目前主要依靠赞助来完善和发展。
- OpenSSL 曾经考虑命名为 OpenTLS,但当时 TLS 还未正式确立,而 SSL 早已广为人知,所以最终使用了 OpenSSL 的名字。
小结
HTTP 是明文传输,所以不安全,容易被拦截或篡改;
通信安全必须同时具备机密性、完整性、身份验证和不可否认这四个特性;
HTTPS 在语法和语义上仍然是 HTTP,但把下层的协议由 TCP/IP 换成了 SSL/TLS;
SSL 最初于 1994 年网景公司开发,并率先应用于自家的网景导航者浏览器中,TLS 是它的标准化版本;
OpenSSL 是著名的开源密码学工具包,是 SSL/TLS 的具体实现。
小贴士
当前所有 TLS 的 RFC 的文档末尾数字都是 “46”(2246、4346、5246、8846)。
除了 HTTP,SSL/TLS 也可以承载其他的应用协议,例如 FTP => FTPS、LDAP => LDAPS。
关于 OpenSSL 有一个著名的“心脏出血”(Heart Bleed)漏洞,出现在 1.0.1 版本。
另一个比较著名的开源密码库是 NSS(Network Security Services),由 Mozilla 开发。
本文只是简要介绍了 HTTPS 涉及的相关内容,有关它们的更详细讲解,例如 TLS 的连接过程、数字签名与证书以及 HTTPS 优化等相关内容,将会在后续文章中再详细介绍。