从 HTTP 到 HTTPS
一、HTTP Begin
1、什么是 HTTP
HTTP 是基于文本传输的协议,它位于 OSI 七层模型的应用层(Application) ,HTTP 是通过客户端向服务器发送请求,服务器响应请求来进行通讯,截止到目前位置 HTTP 协议分别由 6 个独立的协议说明组成,这 6 个协议说明分别是 RFC 7230 、 RFC 7231 、 RFC 7232 、 RFC 7233 、 RFC 7234 、 RFC 7235 。
在这里插入图片描述
说到 HTTP 就不得不说通讯报文,下面我们来看看 HTTP 通讯报文。通讯报文分为 请求报文 和 响应报文 。
请求报文
HTTP 请求报文通常由请求行(request line)、请求头部(header)、空行和请求数据 4 个部分组,如下图所示:
在这里插入图片描述
请求行包含请求方法、URL 和 HTTP 协议版本三个字段组成,在这里需要说的是 请求方法可以实 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT,但是常见的经常用到的就是 GET、POST、DELETE 和 PUT。请求头部由大量键值对组成,请求头部的数据都是向服务器告知客户端的信息,比较常见的请求头有 User-Agent 浏览器类型,Accept 客户端可识别的内容类型列表,Host 请求的主机名。接下来是一个空行,它主要用来通知服务器从当前行开始往下就不再是请求头了。请求数据主要是在 POST 和 PUT 方法中使用,用来向服务器提交客户端的表单信息,一般需要配合着 Content-Type 和 Content-Length 使用。
响应报文
响应报文也是由三部分组成,状态行、消息报头和响应正文。状态行用来告知客户端所请求资源的情况,状态行由 HTTP 版本、服务器回发响应状态码和状态码文本描述组成。这里要说一下响应状态码,状态码类型如下表所示:
类型说明 1xx 表示请求已接收,继续处理 2xx 表示请求已被成功接收、理解、接受 3xx 要完成请求必须进行更进一步的操作 4xx 请求有语法错误或请求无法实现 5xx 服务器未能实现合法的请求
上表看着响应状态码很多,但是大部分在实际运用中很少遇到,经常遇到的状态码一共 7 中,如下表所示:
状态码说明 200 OK 客户端请求成功 400 Bad Request 客户端请求有语法错误,不能被服务器所理解 401 Unauthorized 请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用 403 Forbidden 服务器收到请求,但是拒绝提供服务 404 Not Found 请求资源不存在,举个例子:输入了错误的 URL500 Internal Server Error 服务器发生不可预期的错误 503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
2、HTTP 致命缺点
HTTP 有一个致命的缺点,就是 HTTP 的报文都是以明文的方式进行传输,这样就会导致中间人攻击问题。什么是中间人攻击了,下面我们通过图文的形式讲一下。
A 在客户端向服务器发送了一句话“我今天很好”,这时在数据还没有到达服务器的时候被 B 拦截到,B 将发送的内容改为“我昨天很好”并发送给服务器,最后服务器接收到的信息就是“我昨天很好”而不是“我今天很好”。在这里 B 就是中间人,B 所执行的所有操作就叫做中间人攻击,一图胜千言我们来看图。
在这里插入图片描述
3、HTTP 预防致命缺点手段
要想预防中间人攻击我们就需要对发送的报文信息进行加密处理,一般来说我们会采用两种加密手段来预防中间人攻击:对称加密和非对称加密。
对称加密
首先 A 发送一条信息告诉服务器我要和你通讯了,服务器收到这条信息后响应一条信息告诉 A 的加密方式(例如 AES 加密)和密钥,最后 A 用和服务器协商好的加密方式对信息进行加密并发送,服务器收到信息后利用密钥进行解密即可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
非对称加密
针对前面所说的情况我们可以使用非对称加密对密钥进行加密处理。同样首先 A 发送一条信息告诉服务器我要和你通讯了,服务器收到这条信息后先利用非对称加密(例如 RSA)生成一个公钥和一个私钥,然后服务器将公钥发发送给 A ,A 在本地生成一个密钥并利用服务器发回的公钥进行加密,完成后发送给服务器,服务器收到后利用私钥进行解密得到对称加密的密钥,最后双方利用约定好的加密方式和密钥进行通信。
在这里插入图片描述
在这里插入图片描述
到这里一定会由同学问,这两种方法都无法完全避免中间人攻击,还有其他的办法吗?下面我们伟大的 HTTPS 就要登场了,它可以完全避免中间人攻击。
二、HTTPS End
什么是 HTTPS
HTTPS 就是 HTTP 和 TLS 的简称,以前的 HTTPS 使用的是 SSL ,现在的 HTTPS 使用的是 SSL 。TLS 整体上来说和非对称加密是一样的,主要是对 AES 密钥加密的。简单来说就是 A 发送一条信息给服务器告诉服务器我要和你通信,然后服务器返回 TLS/SSL 证数,客户端在收到证书后校验证书的有效性,如果证书有效就生成生成 AES 密钥并用证书中的公钥加密,然后发送给服务器。服务器确认收到后,就可以利用 AES 密钥进行加密通信了。
在这里插入图片描述
关于 CA 认证体系
CA 认证体系是 HTTPS 防止中间人攻击的核心,客户端需要对服务器发来的证书进行安全性校验。那么客户端是怎么校验证书的安全性呢?下面我们来讲解一下。
证书都是由权威的认证机构颁发的,并且这些认证机构办法的证书目前已经内置到了操作系统中(Windows 是这样,其他的操作系统不慎了解),这些证书被称为 CA 根证书。当我们的服务器需要使用 HTTPS 的时候,就需要将服务器生成的公钥和网站相关信息发给权威认证机构,然后权威认证机构通过服务器发送的相关信息用进行加签,由此得到了服务器证书,这个证书对应的生成证书内容的签名,并将该这个签名使用权威认证机构的私钥进行加密得到证书指纹,并且和上级证书生成关系链(上级证书最后都是 CA 根证书)。当客户端收到服务器发来的证书后,首先会通过层级关系找到上级证书,然后利用上级证书里的公钥解密服务器证书的证书指纹,解密后得到签名。然后通过签名算法算出服务器证书的签名,并对比两个签名是否一样,一样就说明服务器发来的证书是不存在问题的。这里证书校验用的 RSA 是通过私钥加密证书签名,公钥解密来巧妙的验证证书有效性的。通过 CA 认证体系就可以避免了中间人窃取 AES 密钥并发起拦截和修改 HTTP 通讯的报文。
三、总结
这篇文章唠唠叨叨的讲了这么多关于 HTTP 和 HTTPS 的知识,看似很基础其实在很多时候我们发出去或接受到的数据不准确其实就是因为中间人攻击造成的,因此我们在开发部署网站的时候应该尽可能的使用 HTTPS 。
版权声明: 本文为 InfoQ 作者【喵叔】的原创文章。
原文链接:【http://xie.infoq.cn/article/574edd53d0e498a512549aeb7】。未经作者许可,禁止转载。
评论