HTTPS
HTTP的缺点
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,因此有可能已遭篡改
使用明文被窃听
其实即使是已经加密处理的通信,也会被窥视窃听,只不过窃听的是加密过的信息,需要对其进行破解。在互联网上通过抓包工具就可以获取HTTP协议的请求和响应的内容,并对其进行解析。
加密处理防止被窃听
通信加密:
HTTP中没有加密机制,但可以通过SSL(Secure Socket Layer,安全套接层)或TSL(Transport Layer Security,安全层传输协议)的组合使用,加密HTTP的通信内容。
用SSL建立安全通信线路之后,就可以在这条线路上进行HTTP通信了。称为HTTPS或者是HTTP over SSL。
内容加密:
对参与通信的内容本身进行加密。这种情况下需要客户端对报文内容进行加密处理后再发送请求。
通信方的身份就可能遭遇伪装
任何人都可以发送请求
在HTTP通信时,不存在确认通信方的处理步骤,因此任何人都可以发送请求,简单来说就是服务器对所有请求都来者不拒。因此会存在以下隐患:
- 无法确定目标服务器是否是正确的服务器,有可能是已伪装的服务器
- 无法确定响应返回的客户端是否是正确的客户端,有可能是已伪装的客户端
- 无法确定正在通信的对方是否具有访问权限
- 无意义的请求也会照单全收。导致Dos攻击
查明对手的证书
在HTTP协议中,我们无法确定通信方,但是通过SSL,我们不仅可以实现加密处理,还可以通过证书来确定通信方。
证书由第三方权威机构颁发,用以证明服务器和客户端都是实际存在的,伪造证书是非常困难的一件事。所有只要确认通信放持有的证书,即可判断通信方的真实意图。
报文可能被篡改
内容可能有误
由于HTTP协议无法证明通信的报文完整性,因此在请求或响应发出去到接收方接收到报文这段时间内,即使报文遭到篡改,我们也无从获悉。这样的篡改攻击就是中间人攻击。
HTTP+加密+认证+完整性保护 = HTTPS
HTTPS是身披SSL外壳的HTTP
HTTPS并非是应用层的一种新协议,只是HTTP通信接口部分用SSL和TSL协议代替。
通常,HTTP直接和TCP通信。当使用SSL时,演变成先和SSL通信,再由SSL和TCP通信。
SSL是独立于HTTP的协议,可以配合其他任意应用层的协议使用。
公开密钥加密技术(Public-key cryptography)
SSL采用了一种叫做公开密钥加密的加密处理方式,即加密算法是公开的,而密钥是保密的。
共享密钥加密
加密和解密公用一个密钥的方式称为共享密钥加密,也被叫做对称密钥加密。用对称密钥加密方式时,如何安全地转交密钥是一个很大的难题。因为一旦被中间人拿到了密钥,那么加密也就失去了意义。
公开密钥加密
公开密钥加密很好地解决了上面的难题。我们使用一对非对称的密钥。一把叫做私有密钥,另外一把叫做公开密钥。私有密钥不能让其他任何人知道,而公开密钥任何人都可以获得。
使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。
HTTPS采用混合加密机制
HTTPS采用共享密钥加密和公开密钥加密两种并用的混合加密机制。如果密钥能够安全交换,优先使用共享密钥加密,否则使用公开密钥加密。但是公开密钥加密的速度要稍慢一些。所以应该充分利用两者的优势,组合使用。
证明公钥密钥正确性的证书
公开密钥加密方式存在的缺陷:无法证明公开密钥本身就是货真价实的公开密钥。换言之就是存在公开密钥被篡改的风险。
为了解决这个缺陷,可以使用由数字证书认证机构(CA)和其他相关机关颁发的公开密钥证书。
数字证书认证机构流程:
- 服务器运营人员提出公开密钥申请
- 数字证书机构判明申请者身份
- 对已申请的公开密钥做数字签名
- 分配这个已签名的公开密钥,放入公钥证书并绑定
HTTPS的安全通信机制
HTTPS的通信步骤如下图:
- 客户端发送ClientHello报文开始SSL通信。报文中包含客户端支持的SSL的指定版本、加密组件列表等
- 服务器可进行SSL通信时,已ServerHello报文作为回应。报文中也包含SSL版本以及加密组件
- 服务器发送Certificate报文。包含公开密钥证书
- 服务器发送ServerHelloDone报文。通知客户端SSL第一次握手阶段结束
- 客户端发送ClientKeyExchange报文。报文中包含一种随机密码串。
- 客户端发送ChangeCipherSpec报文。提示服务器此后的报文会用第五步里的随机密码串进行加密
- 客户端发送Finished报文。包含连接至今全部报文的校验值。
- 服务器发送ChangeCipherSpec报文
- 服务器发送Finished报文
- 服务器和客户端的Finished报文交换完毕,SSL连接建立完成,从此开启HTTP请求
- 应用层协议通信
- 客户端断开连接