HTTPS

为什么需要HTTPS?

  • 在HTTP/3.0之前HTTP的传输仍然是明文(不管是文本还是二进制)的传输方式
  • 而且HTTP并没有对通信双方的身份进行验证,因此有可能遭遇伪装
  • 没有对传输内容的完整性做出保证,可能传输接收方得到的数据是篡改后的

以上三点就完美得突出了不安全的特点

HTTPS的出现,也是为了解决HTTP不安全特点的一个解决方案

什么是HTTPS

超文本传输安全协议(Hypertext Transfer Protocol Secure,简称:HTTPS)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,利用SSL/TLS来加密数据包。HTTPS的主要目的是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。

简单来说,HTTPS = HTTP + SSL/TLS,HTTPS就是HTTP的加强安全版!

HTTP协议采用明文传输信息,存在信息窃听信息篡改信息劫持的风险,而协议TLS/SSL具有身份验证信息加密完整性校验的功能,可以避免此类问题发生。

安全层的主要职责就是对发起的HTTP请求的数据进行加密操作对接收到的HTTP的内容进行解密操作

TLS/SSL的工作原理

TLS/SSL全称安全传输层协议(Transport Layer Security), 是介于TCP和HTTP之间的一层安全协议(不属于OSI七层模型中,介于应用层和传输层之间),不影响原有的TCP协议和HTTP协议,所以使用HTTPS基本上不需要对HTTP页面进行太多的改造。

TLS/SSL的功能实现主要依赖三类基本算法:散列函数hash对称加密非对称加密。这三类算法的作用如下:

  • 基于散列函数验证信息的完整性(完整性校验)
  • 对称加密算法采用协商的秘钥对数据加密(信息加密)
  • 非对称加密实现身份认证和秘钥协商(身份验证)

非对称加密

  • 方法

    我们拥有两个秘钥,秘钥成对出现,一个是公钥,一个是私钥。公钥是公开的,私钥是保密的。用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据,只有对应的私钥才能解密,因此掌握公钥的不同客户端之间不能相互解密信息,只能和服务器进行加密通信,我们可以将公钥公布出去,任何想和我们通信的客户端, 都可以使用我们提供的公钥对数据进行加密,这样我们就可以使用私钥进行解密,这样就能保证数据的安全了。服务器可以实现一对多的的通信,客户端也可以用来验证掌握私钥的服务器的身份。

  • 缺点

    加密的过程很慢,因此如果每次通信都使用非对称加密的方式的话,反而会造成等待时间过长的问题。

  • 常见的非对称加密算法

    RSA、ECC、DH等。。

  • 特点:

    非对称加密的特点就是信息一对多,服务器只需要维持一个私钥就可以和多个客户端进行通信,但服务器发出的信息能够被所有的客户端解密,且该算法的计算复杂,加密的速度慢。

对称加密

  • 方法

    双方使用同一个秘钥对数据进行加密和解密。

  • 缺点

    无法保证秘钥传输的安全性,因为秘钥还是会通过网络传输的,一旦秘钥被其他人获取到,那么整个加密过程就毫无作用了。

  • 常见的对称加密算法

    AES-CBC、DES、3DES、AES-GCM等。

  • 特点

    对称加密的优势就是信息传输使用一对一,需要共享相同的密码,密码的安全是保证信息安全的基础,服务器和N个客户端通信,需要维持N个密码记录且不能修改密码。

散列算法

常见的散列函数有MD5、SHA1、SHA256。该函数的特点是单向不可逆,对输入数据非常敏感,输出的长度固定,任何数据的修改都会改变散列函数的结果,可以用于防止信息篡改并验证数据的完整性。

特点:在信息传输过程中,散列函数不能三都实现信息防篡改,由于传输是明文传输,中间人可以修改信息后重新计算信息的摘要,所以需要对传输的信息和信息摘要进行加密。

什么是数字证书

上面的安全层的工作原理也并不是绝对的安全,像非对称加密中,无法确保公钥的绝对安全,如果公钥被中间人拦截,并重新生成一套秘钥,然后将他自己的公钥发送给我们,当我们使用他的公钥加密后发送的信息,就可以被他用自己的私钥解密。然后他伪装成我们以同样的方法向对方发送信息,这样我们的信息就被窃取了,然而自己还不知道。数字证书就是为了解决这个问题的

步骤

  1. 服务端非对称加密,生成一对秘钥

  2. 将公钥在CA进行登录,需要向认证中心申请发行证书,证明这个公钥确实由自己生成。

  3. 服务端公钥和包含邮箱信息的个人资料发送给认证中心CA

  4. CA对收到的资料进行确认,确认资料的真实性

  5. 确认完毕后,CA使用自己的私钥,根据服务端的资料(邮箱信息的个人资料)生成数字签名。

    数字签名就是一段信息或者一个文件通过某个哈希算法(也叫摘要算法)而得到的一串字符再进行加密后的信息。

  6. CA将生成的数字签名和资料放进同一个文件中(这个文件就是数字证书)

  7. 当客户端期望发起HTTPS请求时,服务器将公钥证书返回

  8. 客户端获取服务器返回的公钥证书,确认数字证书里的地址确实是需要请求的地址

  9. 客户端获取CA公开的公钥对公钥证书里的签名进行解密验证,如果验证结果没有异常,就能说明这份证书的确由认证中心发行。

  10. 客户端确认了证书是由CA发行的,且证书中的地址就是期望请求的服务端地址后,客户端从证书中取出服务端的公钥。

这样,公钥便从服务端安全得传到了客户端。

HTTPS的通信前置工作

由于传输层并没有改变,所以仍然是TCP的三次握手,由于添加了安全层的TLS,所以还需要TLS的四次握手过程

HTTPS 首次通信需要 7 次握手!!!!!!!

TLS的握手过程

  1. 客户端向服务端发起请求
    • TLS的版本
    • 一个客户端生成的随机数,稍后用于生成”会话密钥” (1)
    • 客户端支持的加密方法
  2. 服务端回应
    • 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
    • 一个服务器生成的随机数,稍后用于生成”会话密钥”(2)
    • 确认使用的加密方法,比如RSA非对称加密
    • 服务器证书
  3. 客户端回应
    • 客户端收到服务器回应以后,开始走证书链逐级验证,确认证书的真实性,如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
    • 如果证书真实有效,从证书中拿出服务器公钥
    • 一个用服务器公钥加密随机数,防止被窃听(3)
    • 把之前所有发送的数据做个摘要(hash值),再加密一下,供服务器校验
    • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送(Change Cipher Spec) 客户端握手结束通知(Finished),表示客户端的握手阶段已经结束。
  • 服务器的最后回应
    • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送(Change Cipher Spec)
    • 服务端握手结束通知(Finished),表示服务端的握手阶段已经结束。这一项是把之前所有发送的数据做个摘要(hash值),再加密一下,供客户端校验

客户端和服务器端根据约定的加密方法使用前面的三个随机数,生成对话秘钥,以后的对话过程都使用这个秘钥来加密信息。

TLS握手结束后,双方开始使用对称会话密钥进行加密通信。

HTTPS的优点

安全

HTTPS的缺点

  • 加密解密损耗大量资源
  • 握手阶段费时,增加了页面的加载速度
  • 证书需要收费,并且证书绑定IP