一、前言
这篇文章主要是对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和证书
CA是Certificate 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会是更好的选择。