HTTP vs HTTPS vs HSTS

在推动公司的全站 HTTPS + HSTS ,整理用到的知识,供以后查阅只用。

1. HTTP 背景知识

1.1 HTTP/0.9

单行协议,极其简单。

请求:由单行指令构成,以唯一可用方法 GET 开头,其后跟目标资源路径

GET /mypage.html

响应:只包含响应文档本身

<HTML>
这是一个非常简单的HTML页面
</HTML>

缺点:

  • 只能传输 HTML 文件,无法传输其他类型的文件
  • 无法判断请求执行的结果

1.2 HTTP/1.0

构建可扩展性,HTTP/1.0 扩展了以下的内容,使之用途更广泛:

  • 发送信息中包含协议版本信息
  • 增加状态码用于代表执行结果的成功或者失败
  • 引入 HTTP 头的概念,对于请求和响应,允许传输元数据,使协议变得更灵活,扩展性更强
  • 在 HTTP 头中增加 Content-Type 类型,具备了传输其他类型文档的能力
GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML> 
一个包含图片的页面
  <IMG SRC="/myimage.gif">
</HTML>

缺点:

  • 以上新扩展作为一种尝试出现,并未被引入到标准中

1.3 HTTP/1.1

标准化的协议,HTTP/1.0 多种不同的实现方式在实际运行中显得十分混乱,HTTP/1.1 统一了标准并引入多项的改进内容:

  • 默认长连接机制,节省多次 TCP 连接建立消耗的时间
  • Pipelie 机制,允许第一个应答被完全发送之前就发送第二个请求
  • Chunked 编码传输
  • Header 中引入 host
  • 更详细的 Cache 机制

一次完整的请求流程如下:

GET /en-US/docs/Glossary/Simple_header HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header

200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 20 Jul 2016 10:55:30 GMT
Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a"
Keep-Alive: timeout=5, max=1000
Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT
Server: Apache
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding

(content)

注意

  • HTTP 协议已经稳定使用超过 15 年,期间进行过两次修订RFC 2616 发布于1999年6月,而另外两个文档 RFC 7230-RFC 7235 发布于2014年6月
  • 由于 HTTP 协议明文传输数据,基于安全的考虑,网景公司在 HTTP 的基础上创建了一个额外的加密传输层:SSL。(SSL 1.0 没有在公司以外发布过)

1.4 HTTP2

为了更优异的表现,谷歌实践了一个实验性的协议 SPDY 协议旨在解决 HTTP/1.x 中存在的诸如连接复用、头部冗余等问题。SPDY 协议位于 HTTP 和 SSL 之间,属于应用层协议,主要特性如下:

  • 多路复用
  • 请求优先级
  • header 压缩
  • 服务端推送

SPDY 协议成为了 HTTP/2 协议的基础,可以看到 HTTP2 协议的很多特性跟 SPDY 协议提供的是有主体是重合的,但仍有少许差异点:

  • HTTP/2 可以在 TCP 上直接使用,不像 SPDY 那样必须在 TLS 上
  • 添加了新的头部压缩算法 HPACK
  • 添加了控制帧的种类
  • 完善协议商讨和 Server Push 的流程

2. HTTPS 出现的原因

2.1 原因

一种新技术的出现必然是因为当前技术无法满足当时社会的要求。从安全性的角度对比下 HTTP 和 HTTPS 协议:

安全性HTTPHTTPS
窃听风险信息明文传递,可被拦截窃听信息加密传输
篡改风险被拦截下的信息可被篡改信息校验,接收方可通过校验机制发现篡改行为
伪装风险无法验证对端的真实性身份校验

注意

  • 由于对数据进行加解密,决定了它天生比 HTTP 慢

2.2 HTTPS 协议组成

HTTPS 是在 HTTP 上建立 SSL/TLS 加密层,并对传输数据进行加密。
在这里插入图片描述

SSL/TLS 协议的基本过程是:

  1. 客户端向服务端索要并验证公钥
  2. 双方协商生产「对话密钥」
  3. 双方使用对话密钥通信

步骤1、2 为「握手阶段」,完成的详细过程见下图:

在这里插入图片描述

「握手阶段」所有的通信都是明文的

  1. (ClientHello)客户端向服务端提供以下信息:
    • 支持的协议版本
    • 客户端生成的随机数,稍后用于生成「对话密钥」
    • 支持的加密方法
    • 支持的压缩方法
  2. (ServerHello)服务端回应:
    • 确认使用的加密通信协议版本
    • 服务端生成的随机数,稍后用于生成「对话密钥」
    • 确定使用的加密方法
    • 服务器证书
  3. 客户端回应
    • 一个随机数。用于服务器公钥加密,防止被窃听
    • 编码改变通知,表示随后的信息都将用双方协商好的加密方法和密钥发送
    • 客户端握手结束通知,表示客户端的握手阶段已经结束
  4. 服务器最后回应
    • 编码改变通知,表示随后的信息都将用双方协商好的加密方法和密钥发送
    • 服务器握手结束通知,表示服务器的握手阶段已经结束。

以上是从理论的层面上大致了解了下 SSL/TLS 做了什么,后面文章会从实际使用中抓包分析真实过程。

3. HSTS 解决了什么问题

3.1 概念

HSTS HTTP 严格传输安全,网站可以选择使用 HSTS 策略,来让浏览器强制使用 HTTPS 与网站进行通信,以减少回话被劫持的风险。

3.2 作用

抵御 SSL 剥离攻击, SSL剥离的实施方法是阻止浏览器与服务器创建HTTPS连接。它的前提是用户很少直接在地址栏输入https://,用户总是通过点击链接或3xx重定向,从HTTP页面进入HTTPS页面。所以攻击者可以在用户访问HTTP页面时替换所有https://开头的链接为http://,达到阻止HTTPS的目的。

HSTS 可以很大程度上解决 SSL 剥离攻击,因为只要浏览器与服务器创建过一次安全连接,之后浏览器会强制使用 HTTPS。

4. 待扩展知识点

  • 长连接 & Pipelie 机制
  • SPDY 协议
  • SSL & TLS 协议实现
  • HSTS demo

5.参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值