浅析https协议

757 阅读5分钟

背景

HTTP为明文传输,起初设计HTTP协议的目的很单纯,就是为了传输超文本文件,那时候也没有太强的加密传输数据需求,所以HTTP一直保持着明文传输数据的特征。正是因为这一特性,传输过程中的每个环节,数据都有可能被篡改或窃取。

引入安全层

因此我们需要引入一个加密方案。 从HTTP协议栈层面来看,可以在TCP和HTTP之前插入一个安全层,所有经过安全层的数据都会加密或者解密。

通常HTTP直接和TCP通信,HTTPS则先和安全层通信,然后安全层再和TCP层通信。可以概括为两个职责:

  • 对发起HTTP请求的数据进行加密操作
  • 对接收到HTTP的内容进行解密操作

第一版:使用对称加密

对称加密即指加密和解密用的是相同的密钥 在HTTPS发送该数据之前,浏览器和服务器之间需要协商加密方式和密钥,过程如下

  • 浏览器发送它所支持的加密套件列表(加密的方法)和一个随机数client-random
  • 服务器从加密套件列表中选取一个加密套件,然后还会生成一个随机数service-random,并将service-random和加密套件列表返回给浏览器
  • 浏览器和服务端分别返回确认消息
  • 浏览器和服务端利用相同的方法把client-random和service-random混合起来生成一个密钥master secret,然后开始进行数据的加密传输

缺点: client-random和seervice-random传输过程是明文的,黑客也可以拿到协商的加密套件和双方的随机数,黑客也可以合成密钥


第二版:使用非对称加密

非对称加密算法有A、B两把密钥,如果你用A密钥来加密,那么只能使用B密钥来解密。 服务器会自己保留私钥,然后将公钥以明文的方法发给浏览器

  • 首先浏览器还是将加密套件列表发给服务器
  • 服务器会选择一个加密套件,然后将加密套件和公钥一起发送给浏览器
  • 然后就是浏览器和服务器返回确认消息
  • 这样浏览器在发送数据时就可以使用该公钥来加密数据,然后服务器使用私钥来解密数据

缺点:

  • 非对称加密效率太低,影响页面打开速度
  • 无法保证服务器发送给浏览器的数据安全,服务端采用私钥加密,只能用公钥解密,黑客也是可以获取到公钥的,从而可以解开数据

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

基于以上两点缺点,可以选择一个更加完美的方案,在传输数据阶段依然使用对称加密,但是对称加密的密钥我们采用非对称加密来传输

  • 浏览器向服务器发送对称加密套件列表、非对称加密套件列表和随机数client-random
  • 服务器保存随机数client-random,选择对称加密和非对称加密的套件,然后生成随机数service-random,向浏览器发送选择的加密套件、serice-random和公钥
  • 浏览器保存公钥,利用client-random和service-random计算出来pre-master,然后利用公钥对pre-master加密,并向服务器发送加密后的数据
  • 服务器拿出自己的私钥,解密出pre-master数据,并返回确认消息
  • 通过这三组随机数生成对称密钥,使用对称加密的方式来传输数据

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


第四版 添加数字证书

以上方式仍然存在问题,例如访问百度时,黑客有可能通过dns劫持将ip地址替换成黑客的ip地址,这样访问的就是黑客的服务器,黑客可以在自己的服务器上实现公钥和私钥。 那么怎么证明访问的服务器是百度的,就需要使用权威机构(Certiificate Atuthority)颁发的数字证书(Diital Certificate)。

对于浏览器来说,数字证书有两个作用:

1)向浏览器证明服务器身份

2)数字证书中包含了服务器的公钥


数字证书的申请和验证

申请数字证书

  • 服务器准备一套私钥和公钥,私钥留着自己使用
  • 向CA机构提交公钥、公司、站点等信息并等待认证
  • CA通过线上、线下多种渠道来验证网站所提供信息的真实性
  • 审核通过,会颁发认证的数字证书,包含网站的公钥、组织信息、CA信息、有效时间、证书序列号,同时包含一个CA生成的数字签名

签名:CA使用Hash函数计算网站提交的明文信息,并得出信息摘要,然后再使用他的私钥对信息摘要进行加密,加密后的秘闻就是数字签名

浏览器如何验证数字证书

  • 读取证书中的明文信息,采用CA签名时相同的hash函数计算并得到信息摘要A,再利用对应CA的公钥解密签名数据,得到信息摘要B; 对比两者如果一致,则说明证书合法
  • 这时候验证了CA是谁,但是浏览器不知道该不该信任,就会继续查找给这个CA颁发证书的CA, 再以同样的方式验证它上级CA的可靠性。通常操作系统会内置信任的顶级CA的证书信息,如果这个CA链中没有找到浏览器内置的顶级CA,证书也会被判定非法

参考

极客时间《浏览器原理与实践》