搞懂HTTPS

2,216 阅读5分钟

总结下HTTPS相关知识点

HTTP协议

HTTP (HyperText Transfer Protocol,超文本传输协议) 是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。

  • 缺点

HTTP协议是明文传输协议,通信过程中被中间人进行劫持、监听、篡改,会造成个人隐私泄露等严重的安全问题

HTTPS

在传输层和应用层加了TSL/SSL

  1. 如何加密?
  • 对称加密

Client -> Server 通过密钥进行发送方加密、接收方解密

问题?如何安全传输密钥,密钥被中间人劫持,一切加密解密都是浪费时间

  • 非对称加密

也叫公开密钥加密,有私钥和公钥

  1. Client发送消息给ServerClientServer的公钥进行加密,server用自己的私钥进行解密,反之亦然。
  2. 一切看似很完美,但其实还有问题

中间人劫持

如果我们使用非对称加密传输数据,会有如下问题:

客户端如何获取服务器的公钥?

  1. 三次握手阶段:Server发送自己的公钥给Client,中间人H拿到Server的公钥,然后发送自己的公钥给client
  2. ClientH的公钥进行加密,发给Server,中间人H劫持到消息,用自己的私钥进行解密,然后用server的公钥进行加密,发送给ServerServer用自己的私钥进行解密,得到消息。
  3. ClientServer都觉得消息在正常传输,但是已经被中间人劫持了。

引入第三方CA (Certificate Authority证书颁发机构)

  1. 数字证书出场,server主动去权威机构申请
  2. Server把自己的公钥、域名等信息发送给CA
  3. CA拿到后用自己的私钥进行加密
  4. 权威自己用自己的私钥进行加密了, 那应该如何解密?你发送给Client,中间人不是一样可以劫持吗?。鸡生蛋,蛋生鸡的悖论了。
  5. 答案是权威机构的公钥不需要传输,因为权威机构会跟主流的浏览器或操作系统合作,将他们的公钥内置到浏览器或操作系统环境中。
  6. Client收到数字证书后,从数字证书中找到权威机构的信息,从本地找到权威机构的公钥,就能正确解密Server的公钥。

数字证书保证传输安全

如果不校验,中间人也可以向权威机构申请数字证书,然后劫持Server发送的证书,然后发送自己的数字证书给ClientClient接受到后,用本地的公钥解密,拿到中间人的公钥。

解决方案:签名

  1. 数字证书中包含了Server的公钥,机构信息,还包括了证书内容的签名、签名计算方法、证书对应的域名

签名 等于 Server的公钥、其他信息通过HASH函数计算得到证书的数字摘要,权威机构的私钥加密得到数字签名

  1. Client使用公钥解密,得到服务器的公钥、证书的数字签名、签名计算方法。重新计算签名,对比签名是否一致。判断证书是否被中间人篡改。
  2. 如果中间人拿到权威机构的公钥,能解析证书内容并篡改,但是篡改后需要对证书进行加密。中间人没有权威机构的私钥进行加密,强行乱加密,Client就无法用CA的本地公钥进行解密。
  3. 证书调包,中间人向权威机构申请一份证书,Server发送证书给Client,中间人直接替换成自己的证书,Client用本地权威机构的公钥解密,对比证书签名也没问题。但是Client检查证书中的域名和当前访问的是否一致。不一致也会发出警告。

HTTPS通信过程

  1. Client发送Client Hello报文给Server开启SSL通信,报文中包含Random_1

  2. 服务器支持SSL通信的话,发送Server Hello报文回应,报文中包含Random_2

  3. 服务器之后发送Certificate报文,报文中包含数字证书

  4. 服务器再发送Server Hello Done通知Client,最初的SSL握手阶段协商部分结束

  5. Client对数字证书校验,正确后,解密得到服务器的公钥。通过RSA算法随机生成Pre-Master Secret,并且用服务器的公钥进行加密,包含在Client Key Exchange报文中,发送给Server

  6. 客户端继续发送Change Cipher Spec报文,告知Server端,客户端切换协商的加密套件,准备使用协商的加密套件加密数据并传输。

  7. Client发送Finished报文,该报文包含了连接至今全部报文的整体校验值(也就是hash值)

  8. Server接收到Client的请求,用私钥解密,把Pre-master secret取出来。Server发送同样的Change Cipher Spec报文

  9. Server同样发送Finished报文,提供Client校验

  10. ServerClientFinished报文交换完毕,SLL连接建立。开始通信。

随机数如何生成?

  1. ClientServer都通过Random_1andom_2Pre-Master Secret三个随机数,通过伪随机函数PRF生成Master Secret。再根据master secret 推导出hash secretsesson secret

此时用对称加密算法进行通讯,使用哪个作为共享密钥呢?

  1. 双方使用对称加密算法进行加密,用hash secretHTTP报文做一次运算生成一个MAC,附在HTTP报文的后面,然后用session-secret加密所有数据(HTTP+MAC),然后发送。
  2. 接收方则先用session-secret解密数据,然后得到HTTP+MAC,再用相同的算法计算出自己的MAC,如果两个MAC相等,证明数据没有被篡改。

随机数的作用

  1. pre-master secret本身就是一个随机数,再加上HelloServer消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥
  2. 三个随机数让随机数十分接近随机。每次生成对称密钥也是为了如果这次通信被破解,不会导致以前的数据被破解。
  3. 拦截人重复发送报文,扰乱正常通信,Server接收到重复的随机数,可以中断通信。

参考文章

  1. 解析HTTPS