在《图解 HTTP》书中,我们了解到为什么需要使用到安全的 HTTPS 通信。
- 通信使用明文会被窃听。所以进行加密处理防止被窃听,通过 SSL(Secure Socket Layer,安全套接层) 或 TLS(Transport Layer Security,安全层传输协议)组合使用,加密 HTTP 通信内容。
- 通信方的身份可能遭遇伪装,HTTP 协议中的请求和响应不会对通信方进行确认。这个由 SSL 提供的数字证书来解决。
- 无法确认报文的完整性。
SSL
SSL 是独立于 HTTP 的协议,HTTPS 实际上就是在应用层(HTTP)和传输层(TCP)之间加了一层 SSL/TSL。
所以 HTTP 的做法就是,通过 SSL 建立安全的通信线路,然后在这条线路上进行 HTTP 通信。
SSL 采用一种叫做公开密钥加密的处理方式。
共享密钥加密
加密和解密使用同一个密钥的方式就叫做共享密钥加密,也叫对称密钥加密。使用这种方式加密必须将密钥也发送给对方。可是在互联网上进行转交,这是危险的。
公开密钥加密
公开密钥加密采用一对非对称的密钥。分别叫做 private key 和 public key。方式是,发送密文的一方使用对方的 public key 进行加密处理,对方收到加密的信息后,再使用自己的 private key 进行解密。
HTTPS 采用混合加密方式
HTTPS 采用上述两种结合的加密方式。
- 使用 public key 加密方式安全地交换再稍后的共享密钥加密中要使用的密钥。
- 确保交换的密钥是安全的前提下,使用共享密钥方式进行通信。
public 密钥加密处理起来比共享密钥加密方式更复杂,所以在通信时使用公开密钥加密,效率就很低。
证明公开密钥正确性的证书
公开你要加密的方式的问题是,无法证明公开密钥本身就是正确的公开密钥,所以使用由数字认证机构颁发的密钥证书。
HTTPS 的工作流程
整个过程分为一下几个步骤:
- 验证证书的有效性
- 握手生成会话密钥
- 利用会话密钥及逆行内容传输
- 客户端发出请求
客户端先向服务器发出加密通信的请求,被称作
ClientHello
请求。在这一步,客户端主要向服务器提供以下信息:- 支持的协议版本,比如TLS 1.0版
- 一个客户端生成的随机数,稍后用于生成“对话密钥”
- 支持的加密方法,比如RSA公钥加密
- 支持的压缩方法
- 服务器回应
服务器收到客户端请求后,向客户端发出回应,被称作
ServerHello
。- 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版一致,服务器关闭加密通信
- 一个服务器生成的随机数,稍后用于生成“对话密钥”
- 确认使用的加密方法,比如RSA公钥加密
- 服务器证书。
- 客户端验证证书 客户端收到服务器回应以后,首先验证服务器证书。
- 客户端回应
如果证书没有问题,客户端就会从证书中取出服务器的 public key。然后,向服务器发送下面三项信息:
- 一个随机数
- 编码改变通知
- 客户端握手结束通知
- 生成会话密钥
步骤 4 生成的是整个握手阶段出现的第三个随机数,又称
pre-master key
。客户端就同时拥有了三个随机数,接着就用事先商定的加密方法,生成本次会话所用的同一把“会话密钥”。 服务器收到客户端的第三个随机数之后,也生成本次会话所用的同一把“会话密钥”。 - 服务器的最后回应
服务端生成“会话密钥”后,向客户端最后发送下面信息:
- 编码改变通知,表示随后的信息将用双方商定的加密方法和密钥发送。
- 服务器握手结束通知,表示服务器的握手阶段已经结束。 至此,整个握手阶段全部结束。接下来,客户端和服务器进入加密通信,就完全是使用普通的 HTTP 协议,只不过“会话密钥”加密内容。
参考:
- HTTPS运行原理
- 《图解 HTTP》