HTTPs 的基本原理
这篇笔记先从整体上描述一下 HTTPs 的基本原理,不详细讲解协议,针对一些重要概念,再进行一定的扩展。
这篇笔记参考了一篇不错的文章,《程序员赵鑫-白话Https》,感谢你的分享:
为什么会出现 HTTPs 呢?
- 防钓鱼,你怎么知道你访问的网站是否被人伪造了呢?
- 加密传输,防止篡改,保证传输内容的安全性。
HTTPs 涉及三个主要的角色:
- Web 浏览器
- Web 服务器:提供安全访问的网站,多见于网银、购物等,如支付宝、工商银行等
- CA 证书机构:世界上较大的认证机构就那么几家,比如 Symantec(收购了VeriSign)、Comodo、GoDaddy、GlobalSign、Digicert、StartCom、Unizeto 等。
HTTPs 基本原理
如下是 HTTPs 的基本流程图(图片来源于《程序员赵鑫-白话Https》)
HTTPs基本原理-流程这个流程本质上由三个子流程组成:
- 确认证书有效性
- 安全的交换彼此的会话密钥
- 通过会话密钥安全的交换数据
1. 确认证书有效性
浏览器内置一个受信认的 CA 机构列表以及证书。当访问提供 https 服务的网站后,服务器会提供服务器证书。浏览器会对该证书进行判断,如果颁发证书的机构存在于受信任的 CA 列表中,而且证书中的信息和当前正在访问的网站信息一致(比如域名),浏览器就认为该服务器可信,并从服务器证书中获取服务器公钥,用于后续流程。否则将提示用户是否继续。
注:用户可以自行添加或删除受信任的 CA 机构列表。
2. 交换会话密钥
这个步骤也可以称为会话密钥的协商。继续讲解流程之前,要先简单说一下为什么多出来一个会话密钥。
加密可以分为单向密钥加密和双向密钥加密两种方式(可以参考我的另一篇笔记)。
- 单向密钥加密:也称为对称加密。加密与解密采用一套密钥,密钥一旦泄漏,加密体系作废。
- 双向密钥加密:也称为非对称加密。一个公钥,一个私钥。公钥对所有人公开,私钥自己保存。通过公钥无法推导出私钥。公钥加密,私钥解密。
这里说的会话密钥一般采用的都是单向密钥。为什么不采用更加安全的双向密钥加密方式呢?因为双向加密算法更复杂,消耗的计算资源要大很多。在 HTTPs(底层采用 TLS 协议)中,为了折衷安全与性能,通过单向密钥对报文进行加解密,而这个单向密钥则通过双向密钥加密后在两边进行传输。
回到 HTTPs 的流程中:
1)客户端随机生成一套客户端会话密钥,以及为了安全的告知服务器此会话密钥,还随机生成了一套用于会话密钥协商的公钥私钥(一般采用 RSA 算法)。然后客户端使用从服务器证书中获取到的服务器协商公钥对客户端会话密钥和协商公钥进行加密后,发往服务器。
2)服务器收到客户端发过来的加密协商报文后,用服务器协商私钥进行解密,提取出其中的客户端会话密钥和客户端协商公钥,并随机生成一套服务器会话密钥。然后服务器使用提取出的客户端协商公钥对服务器会话密钥进行加密后,发往客户端。
3)客户端收到服务器发过来的加密协商报文后,用客户端协商私钥进行解密,提取其中的服务器会话密钥。至此,客户端拿到了服务器会话密钥,服务器则拿到了客户端会话密钥。
3. 加密通讯
客户端用服务器会话密钥对发往服务器的报文进行加密,服务器收到后用同样的会话密钥进行解密。服务器用客户端会话密钥对发往客户端的报文进行加密,客户端收到后用同样的会话密钥进行解密。
另外,由于会话密钥是随机生成,以会话为粒度,每次协商都会有不一样的结果,所以安全性也比较高。网路上的其它用户,很难窃取和篡改客户端和服务器之间传输的数据,从而保证了数据的私密性和完整性。
总结一下:整个过程涉及6个密钥,确实有一点绕
1) 客户端会话密钥:单向密钥
2) 服务端会话密钥:单向密钥
2) 客户端协商公钥,客户端协商私钥:双向密钥
3) 服务器协商公钥,服务器协商私钥:双向密钥
HTTPs 的应用
如果作为网站服务器侧的开发人员,如何应用 HTTPs 呢?如下是 HTTPs 的应用流程(图片来源于《程序员赵鑫-白话Https》)
HTTPs基本原理-应用HTTPs 底层协议是 SSL/TLS,上述流程本质上也是在讲 SSL/TLS 的流程,最核心的就是密钥协商过程。而基于 SSL/TLS 的其他应用层协议,流程是通用的。
由于加密通讯消耗更大,因此很多网站虽然支持 HTTPs,但实际上对外提供的仍然是 HTTP 服务。随着国家对网络安全重视程度越来越高,网络算力也会逐渐提升上来,HTTPs 应该会在不久得到普遍应用。