从简单到复杂的HTTPS

237 阅读7分钟

在HTTP 协议栈中引入安全层

欢从协议栈层面俩看,我们可以在TCP和HTTP之间插入一个安全层,所有经过安全层的数据都会被加密或者解密(相当于7层结构变八层结构)

可以看出HTTPS并非是一个新的协议,通常HTTP直接和TCP通信,HTTPS则先和安全层通信,然后安全层再和TCP层通信,也就是说 HTTPS所有的安全核心都在安全层,它不会影响到上面的HTTP协议,也不会影响到下面的TCP/IP

总的来说,安全层有两个主要的职责:对发起HTTP请求的数据进行加密操作对接收到HTTP的内容进行解密操作

建立安全连接的过程

要在两台电脑上加解密同一个文件,我们至少需要知道加解密方式和密钥,因此,在HTTPS发送数据之前,浏览器和服务器之间需要协商加密的方式和密钥。这个过程就是HTTPS 建立安全连接的过程。

词释义

加密套件:加密的方法 加密套件列表: 能支持的加密方法的列表 公钥:非对称加密中,服务器铭文发送给路篮球的密钥(每个人都能获取到) 私钥:非对称加密中,服务器自己留下来的密钥(只有服务器才知道)

第一版:使用对称加密

所谓对称加密就是指加密和解密都使用的是相同的密钥

为了让加密的密钥更加难以 被获取,我们让服务器和客户端同时决定密钥,具体过程如下:

  1. 浏览器发送它所支持的加密套件列表和一个随机数 client-random
  2. 服务器从加密套件列表中选取一个加密套件,同时生成一个随机数service-random,并将service-random加密套件返回给浏览器
  3. 最后浏览器和服务器分别返回确认消息

这样浏览器端和服务器端都有相同的client-random 和 service-random, 然后他们在使用相同的方法将clent-random和service-random 混合起来,生成一个密钥master-secret, 有了master-secret 和加密套件之后,双方就可以进行数据的加密传输了。

对称加密的缺点

  1. 传输client-random 和 service-random 的过程是明文的,这意味着黑客可以拿到双方的随机数和加密套件,并且由于用随机数和成密钥的算法是公开(?)的,所以黑客拿到随机数之后 ,也可以生成密钥,这样数据依然可以被了解了

第二版: 使用非对称加密

非对称加密算法,有A\B两把密钥,如果用A密钥加密,只能用B密钥解密,反过来,如果用B密钥加密,只能用A密钥解密

非对称加密流程

  1. 浏览器发送它所支持的加密套件列表 给服务器
  2. 服务器会选择一个加密套件,并将加密套件和公钥一起发给浏览器
  3. 最后浏览器和服务器分别返回确认消息

这样浏览器端就有了服务器的公钥,在浏览器端向服务器发送数据时,就可以用该公钥加密数据,,由于公钥只有私钥才能解密,所以即便何可解惑了数据和公钥也是无法解密的

非对称加密的缺点

  1. 非对称加密的效率太低 。这会严重影响到加解密数据的速度,进而影响到用户打开页面的速度
  2. 无法保证服务器发送给浏览器的数据安全 虽然浏览器端可以用公钥来加密,但是服务端只能用私钥来加密,私钥加密只能公钥才能解密,而黑客也能获取到公钥,这样就不能保证服务端数据的安全了

第三版: 对称加密和非对称加密搭配使用

在传输数据阶段依然使用对称加密,但是对称加密的密钥我们通过非对称加密来传输

流程:

  1. 浏览器向服务器发送对称加密套件列表、非对称加密套件列表和随机数client-random;
  2. 服务器保存随机数client-random,选择对称加密和非对称加密套件,然后生成随机数service-random, 向浏览器发送选择的加密套件,service-random 和公钥
  3. 浏览器保存公钥,并生成随机数pre-master, 然后利用公钥对pre-master 加密,并向服务器发送加密后的数据
  4. 最后服务器拿出自己的私钥,解密出pre-master, 并返回确认消息

到此为止,服务器和浏览器就用了共同的client-radom, service-random 和pre-master,然后服务器和浏览器会使用这三组随机数生成对称密钥,因为服务器和浏览器使用同一套方法来生成密钥,所以最终生成的密钥也是相同的。 有了对称加密的密钥之后,双方就可以使用对称加密的方式来传输数据了

需要特别注意的是,pre-master 是经过公钥加密之后传输的,所以黑客无法获取到pre-master, 这样黑客就无法生成密钥,也就保证了黑客无法解开传输过程中的数据了。

第四版: 添加数字证书

通过对称和非对称的混合方式,完美实现了数据的加密传输,不过这种方法依然存在问题,黑客通过DNS劫持将服务器的IP地址替换成了黑客的IP地址,这样实际上访问的就是黑客的服务器了,黑客就可以在自己的服务器上面实现公钥和私钥了。

那么,怎么证明我就是我?

需要通过权威机构 CA(Certificate Authority),颁发 数字证书(Digittal Certificate)

数字证书的两个作用:

  1. 通过数字证书向浏览器证明服务器的身份
  2. 数字证书里面包含了服务器的公钥

添加了数字证书之后的流程

  1. 浏览器向服务器发送对称加密套件列表、非对称加密套件列表和随机数client-random;
  2. 服务器保存随机数client-random,选择对称加密和非对称加密套件,然后生成随机数service-random, 向浏览器发送选择的加密套件,service-random 和数字证书(这点和第三版布一样,不直接返回公钥)
  3. 浏览器验证数据证书
  4. 浏览器保存公钥,并生成随机数pre-master, 然后利用公钥对pre-master 加密,并向服务器发送加密后的数据
  5. 最后服务器拿出自己的私钥,解密出pre-master, 并返回确认消息

如何申请数字证书

  1. 服务器需要准备一套公钥和私钥,私钥留着自己使用
  2. 服务器向CA机构提交公钥,公司,站点等信息并等待验证
  3. CA通过多种渠道验证服务器提供信息的真实性
  4. 如信息审核通过,CA 会像服务器 签发认证的数字证书,包含了服务器的公钥,组织信息,CA信息,有效时间,证书序列等,这些信息都是明文的,同时包含一个CA生成的签名

CA生成签名的方式

  1. CA使用Hash 函数来计算服务器提交的明文信息,并得出信息摘要
  2. CA使用私钥对信息摘要进行加密,加密后的密文就是CA颁给服务器的数字签名。

浏览器如何验证数字证书

  1. 浏览器读取证书中相关的明文信息,采用CA签名时相同的Hash 函数来计算得到信息摘要A
  2. 利用对应的CA的公钥解密签名数据,得到信息摘要B
  3. 对比信息摘要A和信息摘要B,如果一致,则认为证书合法。
  4. 验证证书相关的域名信息,有效时间等。

浏览器如何验证颁发证书的CA的合法性

通过CA链查找上级CA , 一直查找到操作系统中内置信任的顶级CA的证书信息,如果这个CA链中没有找到操作系统内置的顶级CA,证书也会被判断为非法。