HTTPS 通信过程

与 SSL 组合使用的 HTTP 被称为 HTTPS 或 HTTP over SSL。HTTPS 用来解决 HTTP 不安全传输的问题,HTTP 之所以不安全,是因为:

1. 传输的内容都是明文,可能会被窃听;
2. 不会验证通信双方的身份;
3. 传输内容可能被篡改。

SSL 提供了加密、认证以及摘要的功能,使用 HTTPS 可以有效防止以上问题:

1. HTTPS 会对传输的内容进行加密,加密采用的是对称加密的方式,但对称加密的密钥使用了服务器证书进行了非对称加密;
2. HTTPS 可以在通信前查明对方的证书,从而确认对方的身份;
3. HTTPS 提供了证书验证功能,确保证书来自于目标服务器且未被篡改。

HTTPS 握手

握手过程如下:

  1. 客户端与服务器协商 SSL 的版本和加密组件(加密算法、密钥长度);

    • 客户端发送 Client Hello 报文,报文中包含客户端支持的 SSL 版本及加密组件;
    • 服务端返回 Server Hello 报文,报文中包含服务器支持的 SSL 版本及加密组件;
    • Client Hello 和 Server Hello 报文中还分别包含客户端 random 和服务器 random(通信双方各自生成的随机数)。
  2. 服务端发送 Certificate 报文,报文中包含服务器证书,证书中又包含了服务器公钥;

    • 客户端进行证书验证,验证通过后生成一个随机数 pre-master secret,并使用客户端 random、服务器 random 以及 pre-master secret 生成 master secret,master secret 为会话密钥,之后的数据传输使用会话密钥进行加密/解密。
  3. 服务端发送 Server Hello Done 报文,通知客户端最初阶段的 SSL 握手协商部分结束;
  4. 客户端发送 Client Key Exchange 报文进行回应,报文中包含使用了服务器公钥进行加密的 pre-master secret;

    • 服务器收到报文后生成 master secret(生成方式与客户端相同)。
  5. 客户端发送 Change Cipher Spec 报文,提示服务器之后的通信采用 pre-master secret 密钥加密;
  6. 客户端发送 Finished 报文,该报文包含连接至今全部报文的整体校验值(采用 pre-master secret 加密),若服务器能够正确解密该报文,则此次握手协商成功;
  7. 服务器发送 Change Cipher Spec 报文;
  8. 服务器发送 Finished 报文;
  9. SSL 连接建立完成,客户端和服务端使用会话密钥(master secret)对通信的数据进行加密/解密。

证书验证

证书由受信任的第三方认证机构颁发,且多数浏览器系统已植入了认证机构的机构公钥。
证书(部分)内容包括:

1. 证书的有效时间、域名;
2. 服务器公钥;
3. 指纹算法(哈希算法,用来生成指纹,指纹是一个哈希值);
4. 数字签名(服务器私钥对指纹进行加密得到数字签名)。

证书颁发过程:

  1. 服务器向认证机构申请证书;
  2. 认证机构使用指纹算法对证书(部分)内容进行哈希运算得到指纹,并使用机构私钥对指纹进行加密得到数字签名,然后将该签名和服务器公钥存入证书,并向服务器颁发证书。

浏览器证书验证过程:

  1. 首先验证证书是否过期以及证书的域名是否与请求的域名相同,不相同则验证不通过;
  2. 获取证书的颁发机构,然后从浏览器系统中查询该机构的机构公钥;
  3. 使用机构公钥解密证书上的数字签名,得到一个哈希值 H1;
  4. 浏览器使用指纹算法对证书(部分)内容进行哈希运算,得到另一个哈希值 H2;
  5. 比较 H1 和 H2 是否相同,不相同说明证书被篡改过。

欢迎批评指正!!!


John同学来学习
3 声望1 粉丝

萌新程序员,闲暇之余记录一下近期的学习内容,期待能够每天进步一点点୧☉□☉୨