在 HTTP 协议中有可能存在信息窃听或身份伪装等安全问题。使用 HTTPS 通信机制可以有效地防止这些问题。
7.1 HTTP 的缺点
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
通信使用明文可能会被窃听:
TCP/IP 是可能被窃听的网络
无论世界哪个角落的服务器在和客户端通信时,在此通信线路上的某些网络设备、光缆、计算机等都不可能是个人的私有物,所以不排除某个环节中会遭到恶意窥视行为。
即使已经过加密处理的通信,有可能让人无法破解报文信息的含义,但加密处理后的报文信息本身还是会被看到的。
加密处理防止被窃听
- 通信的加密:通过和 SSL或 TLS的组合使用, 加密 HTTP 的通信内容。用 SSL 建立安全通信线路之后,就可以在这条线路上进行 HTTP 通信,与 SSL 组合使用的 HTTP 被称为 HTTPS
- 内容的加密:把 HTTP 报文里所含的内容进行加密处理。为了做到有效的内容加密,前提是要求客户端和服务器同时具备加密和解密机制
不验证通信方的身份就可能遭遇伪装:
任何人都可发起请求
在 HTTP 协议通信时,由于不存在确认通信方的处理步骤,任何人都可以发起请求。另外,服务器只要接收到请求,不管对方是谁都会返回一个响应
这样做导致的隐患:
- 无法确定请求发送至目标的 Web 服务器是否是按真实意图返回响应的那台服务器。有可能是已伪装的 Web 服务器。
- 无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。有可能是已伪装的客户端。
- 无法确定正在通信的对方是否具备访问权限
- 无法判定请求是来自何方、出自谁手
- 即使是无意义的请求也会照单全收
解决办法:查明对手的证书
SSL 不仅提供加密处理,而且还使用了一种被称为证书的手段,可用于确定方。
证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。
无法证明报文完整性,可能已遭篡改:
接收到的内容可能有误
由于 HTTP 协议无法证明通信的报文完整性,因此,在请求或响应送出之后直到对方接收之前的这段时间内,即使请求或响应的内容遭到篡改,也没有办法获悉。
如何防止篡改
常用的是 MD5 和 SHA-1 等散列值校验的方法, 以及用来确认文件的数字签名方法。但这些方法也无法百分百保证确认结果正确。因为 PGP 和 MD5 本身被改写的话,用户是没有办法意识到的。
7.2 HTTP+ 加密 + 认证 + 完整性保护 =HTTPS
HTTP 加上加密处理和认证以及完整性保护后即是 HTTPS:
HTTPS 解决的问题
对于 HTTP 来说,服务器也好,客户端也好,都是没有办法确认通信方的。因为很有可能并不是和原本预想的通信方在实际通信。 并且还需要考虑到接收到的报文在通信途中已经遭到篡改这一可能性。
HTTPS 是身披 SSL 外壳的 HTTP :
HTTPS 并非是应用层的一种新协议,只是 HTTP 通信接口部分用 SSL和 TLS协议代替而已。
通常,HTTP 直接和 TCP 通信。当使用 SSL 时,则演变成先和 SSL 通 信,再由 SSL 和 TCP 通信。
SSL 是独立于 HTTP 的协议,是当今世界上应用最为广泛的网络安全技术。
相互交换密钥的公开密钥加密技术:
加密方法的安全性的保障:加密算法是公开的,而密钥却是保密的
SSL 采用一种叫做公开密钥加密的加密处理方式。
共享密钥加密的困境
加密和解密同用一个密钥,也被叫做对称密钥加密。
弊端:以共享密钥方式加密时必须将密钥也发给对方,而发送密钥就有被窃听的风险,而不发送对方又不能解密。就算能够安全发送,数据能不能安全到达还不一定。
那么如何解决这个困难呢?如下:
使用两把密钥的公开密钥加密
公开密钥加密使用一对非对称的密钥。一把叫做私有密钥,另一把叫做公开密钥。
发送密文的一方使用对方的公开密钥进 行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。
弊端:若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处理速度要慢。
所以最完美的解决方案如下:
使用两把密钥的公开密钥加密
HTTPS 采用共享密钥加密和公开密钥加密两者并用的混合加密机制。
在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。
证明公开密钥正确性的证书:
公开密钥加密方式存在的问题是:无法证明公开密钥本身就是货真价实的公开密钥。可能在公开密钥传输途中,真正的公开密钥已经被攻击者替换掉了。
如何解决上述问题?
使用由数字证书认证机构(CA)和其相关机关颁发的公开密钥证书。
相关业务流程
- 服务器的运营人员向数字证书认证机构提出公开密钥的申请。
- 数字证书认证机构判明提出申请者的身份
- 对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起
- 服务器将公钥证书发送给客户端,进行公开密钥加密方式通信。
- 客户端使用数字证书认证机构的公开密钥,对那张证书 上的数字签名进行验证
可证明组织真实性的 EV SSL 证书
证书的一个作用是用来证明作为通信一方的服务器是否规范,另外一个作用是可确认对方服务器背后运营的企业是否真实存在。 拥有该特性的证书就是 EV SSL 证书。
用以确认客户端的客户端证书
以客户端证书进行客户端认证,证明服务器正在通信的对方始终是预料之内的客户端,其作用跟服务器证书如出一辙。
客户端证书存在的问题:
- 想获取证书时,用户得自行安装客户端证书(需要付费购买)
- 只能用来证明客户端实际存在,而不能用来证明用户本人的真实有效性。
HTTPS 的安全通信机制
HTTPS 的通信步骤:
- 客户端通过发送 Client Hello 报文开始 SSL 通信
- 服务器可进行 SSL 通信时,以 Server Hello 报文作为应答
- 后服务器发送 Certificate 报文(包含公开密钥证书)
- 服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL 握手协商部分结束
- SSL 第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。
- 客户端发送 Change Cipher Spec 报文,表明在此报文之后的通信会采用 Pre-master secret 密钥加密。
- 客户端发送 Finished 报文
- 服务器发送 Change Cipher Spec 报文
- 服务器发送 Finished 报文
- 服务器和客户端的 Finished 报文交换完毕之后,SSL 连接就算建立完成
- 应用层协议通信,即发送 HTTP 响应
- 最后由客户端断开连接
HTTPS 比 HTTP 要慢 2 到 100 倍
SSL 的慢分两种:
- 通信慢(多了一个SSL 通信)
- 由于大量消耗 CPU 及内存等资源,导致处理速度变慢。
因此,如果是非敏感信息则使用 HTTP 通信,只有在包含个人信息 等敏感数据时,才利用 HTTPS 加密通信。