HTTP基础与HTTPS加密过程

2,381 阅读9分钟

一、前言

这篇文章主要是对HTTP/HTTPS的部分总结,由HTTP协议基础知识引入HTTP协议的缺陷,进而描述HTTPS是如何解决HTTP的缺陷以及HTTPS的工作原理

二、HTTP基础

1、HTTP协议请求响应模型:

HTTP协议永远都是客户端发起请求,服务器回送响应

2、HTTP协议特点

  • 支持客户/服务器模式
  • 简单快速
  • 无连接:无连接的含义是每一次HTTP请求都要经历TCP的连接的建立和断开;(为解决TCP连接问题,HTTP/1.1提出了持久连接的方法)
  • 无状态:HTTP协议对请求处理没有记忆能力,服务器不知道客户端的状态。即客户端发送HTTP请求,服务器做出回应,返回数据,但是服务器不做任何记录;
    • 优点:如果服务器不需要先前传送的信息时,服务端应答就快;
    • 缺点:如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大;(可以通过Session/Cookie技术解决)

HTTP协议无状态的特点导致了:无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。 服务器之所以无法主动发送消息,是因为HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系。 这个缺陷可以用WebSocket协议解决,但这不在本文讨论范围。

3、HTTP协议格式

(1) 请求部分

HTTP请求由三部分组成,分别是:请求行请求头部请求正文

  • 请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本。如:GET /index.html HTTP/1.1
  • 请求头部按照头部字段名称: 头部字段值的格式每行一条;
  • 请求正文请求头部之间存在一个空行;

(2) 响应部分

HTTP响应由三部分组成,分别是:响应行响应头部响应正文

  • 响应行以HTTP协议版本、响应状态码、响应状态描述三部分组成 如:HTTP/1.1 200 OK
  • 响应头部格式同请求头部,但字段名称略有不同;
  • 响应正文响应头部之间存在一个空行;

状态码归类

状态码 状态描述
1xx 指示信息--表示请求已接收,继续处理
2xx 成功--表示请求已被成功接收、理解、接受
3xx 重定向--要完成请求必须进行更进一步的操作
4xx 客户端错误--请求有语法错误或请求无法实现
5xx 服务器端错误--服务器未能实现合法的请求

常用状态码解释

状态码 状态解释
200 OK 客户端请求成功
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized 请求未经授权,这个状态代码必须和WWW-Authenticate头部一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Found 请求资源不存在,eg:输入了错误的URL
500 Internal Server Error 服务器发生不可预期的错误
503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

4、HTTP协议请求方法

目前使用最广泛的HTTP1.1版本,支持以下几个请求方法:

5、HTTP缺点

  1. 通信使用明文,内容可能会被窃听
  2. 无法证明报文的完整性,有可能遭到篡改
  3. 不验证通信方的身份,有可能遭遇伪装

以上这些问题不仅是HTTP协议独有,其他未加密的明文传输协议同样也会存在这类问题。

三、HTTPS基础

HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL(Secure Scket Layer)和TLS(Transport Layer Security)协议代替而已。HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。

HTTPS 协议的主要功能基本都依赖于TLS/SSL协议,TLS/SSL的功能实现主要依赖于三类基本算法:非对称加密对称加密散列函数

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

1、对称加密、非对称加密、CA和证书

了解HTTPS工作原理之前,需要先有关于对称加密非对称加密CA和证书的知识。

(1) 对称加密与非对称加密

  1. 对称加密 这种方式加密和解密同用一个密钥。加密和解密都会用到密钥。没有密钥就无法对密码解密,反过来说,任何人只要持有密钥就能解密了。

对称加密有个明显的缺陷就是秘钥本身如何进行保密和安全传输呢?只要第三方窃取到秘钥,则可以轻易破解密文。解决办法就是通过非对称加密。

  1. 非对称加密 不同于对称加密,非对称加密有一对秘钥,一个是保密的,称为私钥,一个是公开的,称为公钥。私钥加密的数据只有公钥才能解开,公钥加密的数据只有私钥才能解开,这个特性非常重要,因为不需要传输私钥了,而公钥是公开的,可以随便传播。常见的算法实现包括:RSA、DSA等。

非对称加密有个重大缺陷就是计算速度远慢于对称加密

(2) CA和证书

CACertificate Authority的缩写,也叫“证书授权中心”。它是负责管理和签发证书的第三方机构。

可以通过以下方式查看证书内的内容:

证书内至少包含数字签名签名算法公钥有效时间等信息;

2、HTTPS如何解决HTTP存在的缺点

(1) 如何防止窃听

HTTP的一个缺陷就是明文传输,数据包被别人捕获之后就可获取其中的信息。但经过HTTPS传输的数据是经过加密的,而解密用的秘钥是经过双方协商的一次性秘钥,只有通信双方持有。所以其他人即使抓到了HTTPS数据包,也无法看到其中的内容,从而起到防止窃听的作用。

(2) 如何防止伪装

非对称加密方式存在的问题:就是无法证明公开密钥本身就是货真价实的公开密钥。HTTPS通过数字证书认证的方式防止伪装

(3) 如何识别内容已被篡改

网络传输过程中需要经过很多中间节点,虽然数据无法被解密,但可能被篡改。HTTPS通过校验数字签名来识别内容是否被篡改

所谓数字签名,就是对报文进行散列算出的数字摘要。即: 明文 -> 散列运算 -> 摘要 -> 私钥加密 -> 数字签名

服务器在发送报文之前做了3件的事

  • 用哈希算法对报文提取定长摘要;
  • 用私钥对摘要进行加密,作为数字签名;
  • 将数字签名附加到报文末尾发送给客户端;

客户端接收到报文后

  • 用公钥对服务器的数字签名进行解密;
  • 用同样的算法重新计算出报文的数字签名;
  • 比较解密后的签名与自己计算的签名是否一致,如果不一致,说明数据被篡改过;

同样,客户端发送数据时,通过公钥加密报文摘要,服务器用私钥解密,用同样的方法校验数据的完整性。

3、SSL/TLS 握手

SSL/TLS 握手:通过⾮对称加密协商出一次性对称加密的密钥,握手完成以后就通过协商出的对称加密的秘钥加密传输数据。所以HTTPS采用非对称加密对称加密并用的混合加密机制

之所以这样做,是出于对速度和安全性的折中考虑

  1. 非对称加密速度远远慢与对称加密,无法在之后的整个通信中使用非对称加密;
  2. 如果使用服务器中保存的公钥和私有进行非对称加密,因为如果客户端使用公钥加密,只有服务端私有才可解密;如果在服务端使用私钥加密,则任何拥有公钥的人都可解密,没有安全可言。
方法 结构图 描述 优缺点
方案1
采⽤用对称加密来交换密钥 缺点:
1.如果不公开秘钥,对方无法解密;
2.如果公开秘钥,所有人都可以解密,没有安全可言;
方案2
单纯采⽤用⾮非对称加密算法 缺点:
1.没有认证过程,容易出现中间人攻击;
方案3
基于CA 和⾮非对称加密算法 优点:
1.因为校验证书的存在,防止了中间人攻击;
2.使用证书中的公钥完成非对称加密,保证数据安全;
方案4
基于⽅方案3,增加session key复杂度 缺点:
1.客户端与服务器在加密算法选择、算法实现等选择上,兼容性不好;
方案5
基于⽅方案4,增加加密算法协商,增加兼容性 优点:
1.防止中间人攻击;
2.非对称加密协商出对称加密的秘钥,既达到加密传输的目的,也保证了双方秘钥的唯一性;
3.协商过程中的加密算法、版本号、加密套件等参数增加了兼容性;

一次完整的协商过程:

参考 这篇文章

从Server Hello到Server Done,有些服务端的实现是每条单独发送,有服务端实现是合并到一起发送。Sever Hello和Server Done都是只有头没有内容的数据。

四、有了HTTPS,为什么有些网站还是HTTP?

上面的内容解释了HTTPS是怎么解决HTTP缺点的,既然HTTPS是安全可靠的,为什么不是所有的Web网站全都使用HTTPS呢?原因至少有:

  1. 因为需要握手协商秘钥等信息,页面加载时间比使用HTTP要长;
  2. 加密和解密会消耗更多的CPU和内存资源
  3. 购买HTTPS所需证书也是一项开销;

所以,仅仅在包含个人信息等敏感数据时,才会使用HTTPS,尤其是企业提供的对外服务。如果是内网通信时,HTTP会是更好的选择。