1.客户端向服务端发送请求,客户端主要向服务器提供以下信息:

    • 支持的TLS版本,比如TLS 1.0版。
    • 一个客户端生成的随机数,稍后用于生成”对话密钥”。
    • 支持的密码套件列表,比如RSA公钥加密。
    • 支持的压缩方法。

    2.服务器端收到请求后,向客户端做出回应,回应的内容包括:

    • 确认使用的TLS版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
    • 一个服务器生成的随机数,稍后用于生成”对话密钥”。
    • 确认使用的加密方法,比如RSA公钥加密。
    • 服务器证书。

    3.客户端收到服务器回应以后,首先验证服务器证书。
    如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,如下
    HTTPS/TLS - 图1
    如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息:

    • 一个随机数。该随机数用服务器公钥加密,防止被窃听。
    • 至此,客户端和服务端双方都共享了三个随机数,分别是 Client Random、Server Random、pre-master。于是,双方根据已经得到的三个随机数,生成会话密钥(Master Secret),它是对称密钥,用于对后续的 HTTP 请求/响应的数据加解密。
    • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
    • 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验

    证书的验证过程如下:
    CA机构在签发证书的时候,都会使用自己的私钥对证书进行签名,如果我们使用的是购买的证书,那么很有可能,颁发这个证书的CA机构的公钥已经预置在操作系统中。这样浏览器就可以使用CA机构的公钥对服务器的证书进行验签,验签之后得到的是CA机构使用sha256得到的证书摘要,客户端就会对服务器发送过来的证书使用sha256进行哈希计算得到一份摘要,然后对比之前由CA得出来的摘要,就可以知道这个证书是不是正确的,是否被修改过。
    4. 服务端回应
    服务器收到客户端的第三个随机数之后,计算生成本次会话所用的”会话密钥”。然后,向客户端最后发送下面信息:

    • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
    • 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

    会话秘钥是根据前面几次对话过程中产生的三个随机数以及一些其他算法产生的,后面服务器与客户端的交互都是通过这对话秘钥进行加密解密处理的,其他的都和HTTP协议一样。
    image.png
    image.png