https
前言
- 在写
https
之前,先简单梳理一下http
的一些问题- 通信使用明文(不加密) , 内容可能会被窃听
- 由于
HTTP
本身不具备加密的功能, 所以也无法做到对通信整体(使用HTTP
协议通信的请求和响应的内容) 进行加密TCP/IP
是可能被窃听的网络:
- 互联网窃听图
- 加密处理防止被窃听手段
- 通信的加密:通过和
SSL
(Secure Socket Layer
, 安全套接层)或TLS
(Transport Layer Security
, 安全层传输协议) 的组合使用,加密HTTP
的通信内容- 加密后通信图
- 加密后通信图
- 内容的加密:将参与通信的内容本身加密的方式。 由于
HTTP
协议中没有加密机制, 那么就对HTTP
协议传输的内容本身加密。 即把HTTP
报文里所含的内容进行加密处理- 该方式不同于
SSL
或TLS
将整个通信线路加密处理, 所以内容仍有被篡改的风险
- 加密后的内容图
- 该方式不同于
- 通信的加密:通过和
- 由于
- 不验证通信方的身份, 因此有可能遭遇伪装
- 任何人都可发起请求
- 如图
- 如图
- 隐患:
- 无法确定请求发送至目标的 Web 服务器是否是按真实意图返回响应的那台服务器
- 无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端
- 无法确定正在通信的对方是否具备访问权限。 因为某些
Web
服务器上保存着重要的信息, 只想发给特定用户通信的权限 - 无法判定请求是来自何方、 出自谁手
- 即使是无意义的请求也会照单全收。 无法阻止海量请求下的
DoS
攻击(Denial of Service
, 拒绝服务攻击)
- 查明对手的证书
- 可以使用
SSL
确认通信方,SSL
不仅提供加密处理, 而且还使用了一种被称为证书的手段,可用于确定方- 确认通信方
- 通过使用证书, 以证明通信方就是意料中的服务器。 这对使用者个人来讲, 也减少了个人信息泄露的危险性
- 确认通信方
- 可以使用
- 任何人都可发起请求
- 无法证明报文的完整性, 所以有可能已遭篡改
- 所谓完整性是指信息的准确度.若无法证明其完整性, 通常也就意味着无法判断信息是否准确
-
接收到的内容可能有误
- 原因:由于
HTTP
协议无法证明通信的报文完整性, 因此, 在请求或响应送出之后直到对方接收之前的这段时间内, 即使请求或响应的内容遭到篡改, 也没有办法获悉,换句话说, 没有任何办法确认, 发出的请求 / 响应和接收到的请求 / 响应是前后相同的
- 如图
- 像这样, 请求或响应在传输途中, 遭攻击者拦截并篡改内容的攻击称为中间人攻击(
Man-in-the-Middle attack, MITM
) - 中间人攻击
- 原因:由于
-
如何防止篡改
- 常用的是
MD5
和SHA-1
等散列值校验的方法,以及用来确认文件的数字签名方法
- 常用的是
-
- 所谓完整性是指信息的准确度.若无法证明其完整性, 通常也就意味着无法判断信息是否准确
- 通信使用明文(不加密) , 内容可能会被窃听
HTTPS
HTTPS
=HTTP
+ 加密 + 认证 + 完整性保护
概念
HTTP
加上加密处理和认证以及完整性保护后即是HTTPS
,我们把添加了加密及认证机制的HTTP
称为HTTPS(HTTP Secure)
- 使用 HTTPS 通信
- 使用 HTTPS 通信
本质
-
HTTPS
是身披SSL
外壳的HTTP
- HTTPS 并非是应用层的一种新协议。 只是 HTTP 通信接口部分用
SSL(Secure Socket Layer)
和TLS(Transport Layer Security)
协议代替而已HTTP
与HTTPS
通信方式区别图
- 在采用
SSL
后,HTTP
就拥有了HTTPS
的加密、 证书和完整性保护这些功能,SSL
是独立于HTTP
的协议, 所以不光是HTTP
协议, 其他运行在应用层的SMTP
和Telnet
等协议均可配合SSL
协议使用。 可以说SSL
是当今世界上应用最为广泛的网络安全技术
- HTTPS 并非是应用层的一种新协议。 只是 HTTP 通信接口部分用
-
相互交换密钥的公开密钥加密技术
- 加密方法:
SSL
采用一种叫做公开密钥加密(Public-key cryptography
) 的加密处理方式,近代的加密方法中加密算法是公开的, 而密钥却是保密的。 通过这种方式得以保持加密方法的安全性 - 共享密钥加密的困境
- 加密和解密同用一个密钥的方式称为共享密钥加密(
Common key crypto system
) , 也被叫做对称密钥加密- 加密和解密同用一个密钥的方式图
- 密钥发送问题图
- 加密和解密同用一个密钥的方式图
- 使用两把密钥的公开密钥加密
- 公开密钥加密方式很好地解决了共享密钥加密的困难
- 公开密钥加密使用一对非对称的密钥。一把叫做私有密钥 (
private key
),另一把叫做公开密钥(public key
)。顾名思 义,私有密钥不能让其他任何人知道,而公开密钥则可以随意发 布,任何人都可以获得
- 使用公开密钥加密方式
- 加密和解密同用一个密钥的方式称为共享密钥加密(
HTTPS
采用混合加密机制HTTPS
采用共享密钥加密和公开密钥加密两者并用的混合加密机制。若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处理速度要慢。所以应充分利用两者各自的优势,将多种方法组合起来用于通 信。在交换密钥环节使用公开密钥加密方式,之后的建立通信交 换报文阶段则使用共享密钥加密方式- 混合加密机制图
- 混合加密机制图
- 加密方法:
-
HTTPS
的安全通信机制HTTPS
通信图
- 步骤:
-
- 客户端通过发送
Client Hello
报文开始SSL
通信。 报文中包含客户端支持的SSL
的指定版本、 加密组件(Cipher Suite
) 列表(所使用的加密算法及密钥长度等)
- 客户端通过发送
-
- 服务器可进行 SSL通信时, 会以
Server Hello
报文作为应答。 和客户端一样, 在报文中包含SSL
版本以及加密组件。 服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的
- 服务器可进行 SSL通信时, 会以
-
- 之后服务器发送
Certificate
报文。 报文中包含公开密钥证书
- 之后服务器发送
-
- 最后服务器发送
Server Hello Done
报文通知客户端,最初阶段的SSL
握手协商部分结束
- 最后服务器发送
-
- 最后服务器发送
Server Hello Done
报文通知客户端,最初阶段的SSL
握手协商部分结束
- 最后服务器发送
-
- 接着客户端继续发送
Change Cipher Spec
报文。 该报文会提示服务器, 在此报文之后的通信会采用Pre-master secret
密钥加密
- 接着客户端继续发送
-
- 客户端发送
Finished
报文。 该报文包含连接至今全部报文的整体校验值。 这次握手协商是否能够成功, 要以服务器是否能够正确解密该报文作为判定标准
- 客户端发送
-
- 服务器同样发送
Change Cipher Spec
报文
- 服务器同样发送
-
- 服务器同样发送
Finished
报文
- 服务器同样发送
-
- 服务器和客户端的
Finished
报文交换完毕之后, SSL连接就算建立完成。 当然, 通信会受到SSL
的保护。 从此处开始进行应用层协议的通信, 即发送HTTP
请求
- 服务器和客户端的
-
- 应用层协议通信, 即发送
HTTP
响应
- 应用层协议通信, 即发送
-
- 最后由客户端断开连接。 断开连接时, 发送
close_notify
报文。 上图做了一些省略, 这步之后再发送TCP FIN
报文来关闭与TCP
的通信
- 最后由客户端断开连接。 断开连接时, 发送
-
- 完整流程图解
CBC
模式(Cipher Block Chaining): 又名密码分组链接模式。 在此模式下, 将前一个明文块加密处理后和下一个明文块做XOR
运算, 使之重叠, 然后再对运算结果做加密处理。 对第一个明文块做加密时, 要么使用前一段密文的最后一块,要么利用外部生成的初始向量(initial vector, IV
)HTTPS
使用SSL
(Secure Socket Layer
) 和TLS(Transport Layer Security)
这两个协议
- 缺点:
- 1)
HTTPS
也存在一些问题, 那就是当使用SSL
时, 它的处理速度会变慢 - 2) 与纯文本通信相比, 加密通信会消耗更多的
CPU
及内存资源。 如果每次通信都加密, 会消耗相当多的资源, 平摊到一台计算机上时, 能够处理的请求数量必定也会随之减少
HTTPS
使用SSL
图
- 1)
- 综合以上缺点
- 如果是非敏感信息则使用
HTTP
通信, 只有在包含个人信息等敏感数据时, 才利用HTTPS
加密通信
- 如果是非敏感信息则使用