浅显易懂的理解https

2,837 阅读9分钟

写在前面

https对于大多的客户端开发人员来说,如果不过多的进行深入研究,其对于开发使用层面来说和http并没有明显的使用区别,还是一样的向服务端发起接口请求、获取返回数据等;在经常的面试中,会发现很多前端开发同学们对https的工作流程了解的非常模糊,自己本身也是一名前端开发成员,在刚开始学习了解https的过程中,也参考了很多网上相关的技术文章,发现有些文章不是太好理解,特别是对于小白们来说。时间来到了2021年的年底,为完成自己本月的更文计划,本篇文章想通过浅显易懂的方式,介绍https相关的知识。

1. 简单聊下HTTP

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,属于OSI参考模型中的最上层应用层协议。

HTTP协议的缺点:

  • 通信过程使用明文传输,信息容易被窃取
  • 无法校验通信双方身份,身份容易被伪装
  • 无发校验通信报文完整性,信息容易被篡改

2. 什么是HTTPS?

HTTPS协议是Hyper Text Transfer Protocol over SecureSocket Layer(超文本传输安全协议)的缩写,是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。由此可见,HTTPS主要是用来弥补HTTP通信过程中的不足之处:

  • 传输加密
  • 通信双方身份认证

在了解HTTPS工作流程之前,需要了解以下几个概念:

2. 1 TLS/SSL

SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议;

TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性;

在使用http协议时,HTTP直接与TCP通信。默认端口:80

当使用HTTPS时,则需要先与SSL通信,然后再由SSL和TCP通信。默认端口:443

HTTPS = HTTP + TLS/SSL

2. 2 对称加密

什么是对称加密呢?就是加密/解密的双方,使用同一套密钥,该密钥可以用来加密一段内容,也可以用来解密一套内容;

对称加密特点:

  • 加密效率高;
  • 安全性存在一定问题,密钥存放在客户端有被窃取的可能;
2. 3 非对称加密

非对称加密,即密钥分为了两种:公钥私钥,公钥通常存放在客户端,私钥通常存放在服务器。使用公钥加密的数据只有用私钥才能解密,反过来使用私钥加密的数据也只有用公钥才能解密。

非对称加密特点:

  • 安全性高,由于客户端存放的公钥加密的数据,只有私钥才能解密,不用担心公钥被窃取;
  • 加密效率低;
2. 4 了解Hash算法

Hash算法,也叫做散列算法,就是把任意长度的输入通过散列函数变化成固定长度的输出,该输出就是散列值。可以用来以一种较短的信息来标识输入信息的唯一性。常见的Hash算法有MD5、SHA1。

Hash算法特点:

  • 正向快速:给定指定明文和Hash算法,能在有限资源和时间内计算输出散列值。
  • 逆向困难:在有限时间内,基本不可能推断出明文。
  • 输入敏感:明文的微小变动,产生的散列值区别非常大。

3. HTTPS的加密机制

在面试中,很多会问到,HTTPS是采用什么方式加密呢?答案来了,HTTPS采用混合加密机制,即采用非对称加密和对称加密两种加密形式实现安全通道。

对称加密,加密效率高,但是对称加密如何在通信双方安全的交换密钥非常困难,在客户端发起第一次请求,肯定需要采用明文通信,此时服务器如果将密钥以明文的形式交给客户端,那么极有可能被第三方窃取。

非对称加密,安全性高,但由于其需要先进行SSL通信,客户端和服务端都需要在每次请求和响应中进行加密/解密操作,通信效率低,不能快速的响应客户端请求。

故HTTPS结合了对称加密和非对称加密的特点,在客户端和服务端第一次通信时候,采用非对称加密的形式完成随机密钥的传输,在后面的请求中,采用首次生成的密钥进行对称加密。

4. CA机构

在清楚了HTTPS的加密机制后,我们知道在客户端和服务端进行第一次通信时,是采用非对称加密的形式,那么,现在面临一个最大的问题,客户端如何和服务端协商共用的公钥呢?

可能有的人会说,公钥不是所有人都可以获取到吗?公钥不是不用担心被窃取吗?

那么假如客户端获取到的公钥被第三方篡改,客户端使用被篡改的公钥进行加密内容传输,这时候,第三方是不是就可以来窃取客户端请求信息然后使用自己假的私钥进行解密,获得客户端请求信息呢?这是不是一个可怕的漏洞??怎么办??

是时候展现它的重要性了,不错,它就是CA证书机构

4. 1 网站(服务端)向CA机构申请证书

作为一个网站的构建着也可以理解为服务端,如果需要部署自己的服务采用HTTPS协议进行安全通信机制,那么首先要向CA证书机构申请自己的数字证书。

如何申请?

  • 网站管理员,将自己服务端的公钥、网站域名、有效期、公钥进行Hash算法生成的信息摘要等提交到CA证书机构。
  • CA用自己的私钥将申请者的信息摘要进行加密,生成数字签名
  • CA用自己的私钥,将数字签名、公钥、域名等信息加密,生成数字证书
  • CA将生成的数字证书返回给申请者,申请者将获得的数字证书配置到自己的服务端即可。
4. 2 客户端获取CA机构的公钥

既然我们知道了,数字证书就是CA证书机构使用自己的私钥进行加密的一段内容,那么客户端怎么获取到CA证书机构的公钥呢?因为私钥加密的内容,我们需要使用与之对应的公钥进行解密才能获取到服务端的公钥。

答案就是,浏览器厂商在发布浏览器版本时候,都会事先在浏览器内部植入常用认证机关的公开密钥。

5. HTTPS的工作流程

建立HTTPS的安全通信通道,首先就是需要客户端向指定的服务端(需要已经配置好数字证书)发起请求。大致流程如下:

5. 1 客户端发起请求

客户端发起请求,将客户端支持的SSL/TLS版本、支持的加密算法、随机生成的客户端随机数字client_random_1,发送给服务器。

5. 2 服务端响应请求并返回

服务端已经配置有数字证书,在收到客户端的第一次请求时候,根据客户端支持的SSL/TSL版本、支持的加密算法,将服务端数字证书、一个服务端随机生成的随机数字server_random_1发送给客户端。

5. 3 客户端验证数字证书的合法性

客户端在拿到服务端返回的数字证书之后,根据浏览器内部植入的授信CA机构列表,逐一遍历CA机构,使用CA机构的公钥来解密数字证书。

  • 首先,如果根据内部的CA列表不能够解密数字证书,则表示该数字证书存在问题,验证失败,提示客户端用户该访问不被信任;
  • 其次,如果能够正常解密数字证书,客户端会获取到服务端公钥、服务端数字签名、公钥绑定域名等信息,此时客户端会将获取的服务端公钥进行一遍Hash运算得到信息摘要A,解密得到的数字签名再使用CA公钥解密获取信息摘要B,这时候可以比对两个信息摘要以来验证公钥是否被篡改。
  • 最后,公钥验证成功,会再次生成一个随机数字secret_random
5. 4 客户端与服务端协商通信密钥

在证书验证成功后,客户端将再次随机生成的数字secret_random使用服务端公钥加密,发送到服务端。服务端收到后使用自己的私钥解密获得随机数字secret_random,此时,服务端根据两端约定的加密方法,使用双方共有的3个随机数字生成对话密钥(session_key),并使用对话密钥加密传输内容,发送给客户端。

客户端使用同样的算法,使用双方共有的3个随机数字生成客户端的对话密钥(session_key),作为对称加密的密钥key,相互传输加密/解密数据。

6. 写在最后

我们看到,HTTPS是使用混合加密机制,使用非对称加密协商一个密钥key,在之后的通信过程中,以协商密钥使用对称加密算法加密/解密数据,客户端并不保存协商的密钥,密钥在第一次通信的过程中双方协商而来

在前面的协商密钥过程中,为什么需要3个随机数字呢?大概是因为,每个主机并不是都能产生完全的随机数字,使用一个随机数字,它的随机性还比较弱,因此使用3个随机数字一起生成密钥能使得生成的密钥更具有不可推测性。

为什么现在依然有非常多的HTTP服务呢?因为相比简单的HTTP服务,HTTPS需要付出一定的代价,如申请购买数字证书;HTTP不用进行证书校验、协商密钥、加密/解密通信数据,所以使得HTTP服务的响应性要比HTTPS更快。

看到的你,如果有所收获,还请点个赞呦!您的支持就是我持续更文的动力,加油!