也来聊聊 HTTPS.
前言: 网上聊 HTTPS 的文章已经数都数不过来了吧,厚着脸皮,整理下读书笔记,结合平常项目的实践,也来聊聊 HTTPS。
一、为什么需要 HTTPS?
众所周知,HTTP 协议具有无连接、不可靠、尽最大努力的特点,这也为 HTPP 协议带来信息窃听或身份伪装等安全问题。主要体现在几个方面:
- 通信使用明文(不加密),内容可能会被窃听。
- 不验证通信方的身份,因此有可能遭遇伪装。
- 无法证明报文的完整性,所以有可能已遭篡改。
那要如何做到防止窃听保护信息呢?最为普及的就是加密技术。
- 通信的加密:用 SSL(Secure Socket Layer,安全套接层)或 TLS(Transport Layer Security,安全层传输协议)建立安全通信线路之后,就可以在这条线路上进行 HTTP 通信了。与 SSL/TLS 组合使用的 HTTP 就是 HTTPS,通常 HTTP 直接和 TCP 通信,当使用 SSL 时,则演变成先与 SSL 通信,再由 SSL 和 TCP 通信了,所以 HTTPS 并不是一种新的协议。
- 内容的加密: 对 HTTP 协议传输的内容本身加密,即把 HTTP 报文里所含的内容进行加密处理。
SSL 协议最初是由浏览器开发商网景通信公司率先倡导的,开发过 SSL3.0 之前的版本。IETF 以 SSL3.0 为基准,后又制定了 TLS1.0、TLS1.1 和 TLS1.2。TSL 是以 SSL为原型开发的协议,有时会统一称该协议为 SSL。当前主流的版本是 SSL3.0 和 TLS1.0。
SSL 不仅提供加密处理,而且还使用了一种被称为证书的手段,可用于确定通信方。
二、HTTPS 怎么来保障通信安全的?
HTTPS 具有加密、认证以及完整性保护的功能。
1. 加密
客户端和服务端想要进行安全的通信,首先想到的就是对通信双方的内容进行加密处理。客户端利用“密钥”加密内容,服务端利用“密钥”解密内容,反之亦然。这种方式称为对称(共享密钥)加密。
对称加密客户端和服务端的“密钥”是一致的,因此,客户端和服务端之间的“密钥”传输不可避免,如果“密钥”在传输途中被盗用,那么加密处理就没有意义了。
那么如何保护“密钥”的传输安全呢?实践的思路是非对称(公开密钥)加密,服务端拥有 公钥(public key)+ 私钥(private key)的密钥对,公钥任何人都可以获取,私钥只保存在服务端。以下是 SSL 建立安全通信线路的过程。
- 服务端将公钥传输给客户端。
- 客户端通过公钥加密“密钥”(客户端生成)得到一个加密串并传输给服务端。
- 服务端根据私钥解密加密串得到“密钥”。
- 双方通过“密钥”加密传输。
非对称加密“密钥”的方式很好的保障了“密钥”的安全传输,因为即使传输过程中加密串被盗用了,由于盗用者没有私钥信息,也无法得到加密串中的“密钥”信息。
HTTPS 采用对称(共享密钥)加密和非对称(公开密钥)加密两者并用的混合加密机制。之所以要这么复杂,是因为非对称加密的处理速度相较于对称加密要慢,因此,我们一般在交换“密钥”环节使用非对称加密,之后的建立通信交换报文阶段则使用对称加密方式。
2. 认证
遗憾的是,非对称加密传输“密钥”的方式仍然有缺陷,那就是无法证明服务器公钥本身就是货真价实的公钥。比如,接收到某台服务器的公钥,如何证明公钥就是原本预想的那台服务器发行的公钥呢?或许在公钥传输途中,真正的公钥已经被攻击者替换掉了。
计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。
这里我们引入的中间层就是数字证书认证机构(CA,Certificate Authority),数字证书认证机构处于客户端与服务器双方都可信赖的第三方机构的立场上,以下是数字证书认证机构的业务流程。
- 服务器的运营人员向第三方机构 CA 提交公钥、组织信息、个人信息(域名)等信息并申请认证;(不交私钥)
- 数字证书认证机构在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书。
- 证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名;
- 签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA 的私钥对信息摘要进行加密,密文即签名;
- 服务器将公钥证书下发给客户端。
- 客户端使用公钥证书的公开密钥,对那张证书上的数字签名进行验证,一旦验证通过,客户端便可明确两件事:一,认证服务器的公开密钥的是真实有效的数字证书认证机构颁发的。二,服务器的公开密钥是值得信赖的。
- 客户端读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA 的公钥(一般都预置在浏览器中)解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;
- 客户端然后验证证书相关的域名信息、有效时间等信息;
- 客户端会内置信任 CA 的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA 的证书,证书也会被判定非法。
HTTPS 中还可以使用客户端证书,以客户端证书进行客户端认证,证明服务器正在通信的对方始终是预料之内的客户端,其作用跟服务器证书如出一辙。
使用 OpenSSL 这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书,但该服务器证书在互联网上不可作为证书使用,因为个人并不是可信任的三方机构。
3. 完整性保护
基于 SSL 进行 HTTP 通信时,应用层发送数据会附加一种叫做 MAC(Message Authentication Code)的报文摘要,MAC 能够查知报文是否遭到篡改,从而保护报文的完整性。
三、HTTPS 的通信过程
CBC 模式(Cipher Block Chaining)又名密码分组链接模式。在此模式下,将前一个明文块加密处理后和下一个明文块做 XOR 运算,使之重叠,然后再对运算结果做加密处理。 对第一个明文块做加密时,要么使用前一段密文的最后一块,要么利用外部生成的初始向量(initial vector, IV)。
四、HTTPS 的缺点?
处理速度上,由于 HTTPS 还需要做服务器、客户端双方加密及解密过程,因此会消耗 CPU 和内存等硬件资源。
通信上,和单纯 HTTP 通信相比,SSL 通信会消耗部分网络资源。
综上所述,相较于 HTTP 通信来说,HTTPS 通信速度会变慢。针对速度变慢这一问题,并没有根本性的解决方案,我们会使用 SSL 加速器这种(专用服务器)硬件来改善该问题。 该硬件为 SS通信专用硬件,相对软件来讲,能够提高数倍 SSL 的计算速度。
另外,SSL 证书的费用开销也是使用 HTTPS 的考虑因素之一(阿里云/腾讯云有免费的 SSL 证书可以申请使用)。