概述

HTTPS相比较于HTTP而言,就是多了一个S,这个S我们可以称之为安全,说得通俗一点就是加密通信的HTTP而已。说的简单一点,就是每次通信,通信双方都会使用加密之后的数据通信。

连接

HTTPS连接大致可以分为5个步骤,我也是经过学习和看不同的资料才稍微有些感触,如果有不对的地方,请轻喷。
大致可以分为7个部分:

  1. Client Hello
  2. Server Hello
  3. 服务器发送证书
  4. 客户端验证证书
  5. 客户端生成随机数,通过证书中的公钥进行非对称加密,发送到服务器
  6. 服务器使用私钥解密,获取到该随机数,将该随机数设置为**,使用对称加密加密需要发送的数据
  7. 客户端解密数据,SSL通信开始

虽然一个HTTPS通信看上去很简单,其实内部还是非常复杂的,用到了证书验证,一次非对称加密,n次对称加密,单单捋起来还是比较复杂的。

client hello

客户端此时向服务器发送的报文此时包括:

  1. 当前支持的TLS版本集合
  2. 当前支持的非对称加密算法集合
  3. 当前支持的对称加密算法集合
  4. 当前支持的Hash算法集合
  5. 其他信息

server hello

此时,服务器需要选择自己支持的算法,然后发送给客户端,告诉客户端哪些算法是自己支持的。然后给客户端来一份自己的想法:

  1. 当前支持的TLS版本
  2. 当前支持的非对称加密算法
  3. 当前支持的对称加密算法
  4. 当前支持的Hash算法
  5. 其他信息

服务器发送证书

server hello完成之后,服务器又一次向客户端发送了证书和**,这个证书主要是为保证服务器和客户端之间通信是可靠的,证书中有很多东西需要验证。而**就是为了提供了验证的可能。为了方便下面的了解,我们需要对证书的结构有一定的了解。
就X509v3证书为例,主要结构为:

组成部分 含义
tbsCertificate(to be signed certificate) 待签名证书
SignatureAlgorithm 签名算法
Signaturevalue 签名值

而我们的tbsCertificate其实又包含了以下10个方面的东西:

组成部分 含义
Version Number 版本号
Serial Number ***
Signature Algorithm ID 算法签名ID
Issuer Name 发行者
Validity period 有效时间
Subject name 证书主体名称
Subject Public key Info 证书主体公钥信息 (公钥算法和公钥值)
Issuer Unique Identifier 发行商唯一ID
Subject Unique Identifier 主体唯一ID
Extensions 其它扩展

客户端验证证书

这个证书验证还是蛮复杂的,因为涉及到很多概念,比如根证书、二级证书(CA)、 证书链等过程,我也曾经尝试去了解了一下,无奈比较复杂,只是了解了个大概。今天就聊一下这个大概。
客户端拿到这个证书之后,将会从tbsCertificate中获取证书的颁发机构,从而在浏览器内置的根证书中寻找该证书颁发机构是否为信任机构,如果不是,浏览器将会警告用户证书存在问题,一般会出现如下问题:
Https连接过程详解
如果获取的证书颁发机构是合法的,则会从浏览器中找到对应信任机构的公钥,用这个公钥来解密当前证书的签名得到一个Hash值Hash1。上面证书结构中所说的,存在一个签名算法和签名值,这个值是服务器获取的证书(也就是信任机构所颁发的)使用私钥加密而成的,所以使用对应证书的公钥是可以解密的(如果没有错误),具体原因可以查看。然后我们对证书的内容进行一次Hash值,得到Hash2,如果当前的Hash1与Hash2值相等,那么说明证书是合法的,没有被修改过,用户可信任。
在接下来需要对证书的持有者对应的信息进行检查,比如URL是否为需要请求的URL;判断各种请求参数等等…稍微有点不符合,我们就判断当前数据存在问题,直接告警。

客户端产生随机数

如果上面的证书验证通过,此时客户端将会生成一个随机数,通过已经确定的非对称加密算法,使用公钥将这个随机数加密,然后发送到服务器。

服务端解密

服务器接收到数据,将会使用私钥解密发送过来的随机数,将会使用这个随机数设置为**,使用已经选择的对称加密算法,加密数据,然后将数据发送出去,从此服务端SSL通信正式开始。

客户端解密

接受到服务器的数据,使用对称算法,上面生成的随机数作为**,开始解密。从此,一次完整的HTTPS通信过程完成。

最后一张图:

Https连接过程详解
最后,还是对证书的合法性验证存在比较模糊的认识,希望有更好的文章出现。
参考资料:
1.https://blog.csdn.net/liuxingrong666/article/details/83869161
2.https://blog.csdn.net/anjon520/article/details/24884207
3.https://www.cnblogs.com/felixzh/p/8316710.html
4.https://blog.csdn.net/u012852986/article/details/78873387

相关文章: