7.1 HTTP 的缺点
HTTP 主要有这些不足,例举如下。
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
7.1.1 通信使用明文可能会被窃听
由于 HTTP 本身不具备加密的功能,所以也无法做到对通信整体(使用 HTTP 协议通信的请求和响应的内容)进行加密。即, HTTP 报文使用明文(指未经过加密的报文)方式发送。
TCP/IP 是可能被窃听的网络:即使已经过加密处理的通信,也会被窥视到通信内容,这点和未加密的通信是相同的。只是说如果通信经过加密,就有可能让人无法**报文信息的含义,但加密处理后的报文信息本身还是会被看到的。
加密处理防止被窃听
- 通道加密:一种方式就是将通信加密。 HTTP 协议中没有加密机制,但可以通过和 SSL(Secure Socket Layer,安全套接层)或 TLS(Transport Layer Security,安全层传输协议)的组合使用,加密 HTTP 的通信内容。用 SSL 建立安全通信线路之后,就可以在这条线路上进行 HTTP 通信了。与 SSL 组合使用的 HTTP 被称为 HTTPS(HTTP Secure,超文本传输安全协议)或 本文档由 HTTP over SSL Linux公社。
- 内容的加密:在这种情况下,客户端需要对 HTTP 报文进行加密处理后再发送请求。
为了做到有效的内容加密,前提是要求客户端和服务器同时具备加密和解密机制。主要应用在Web 服务中。有一点必须引起注意,由于该方式不同于 SSL 或 TLS 将整个通信线路加密处理,所以内容仍有被篡改的风险。
7.1.2 不验证通信方的身份就可能遭遇伪装
HTTP 协议中的请求和响应不会对通信方进行确认。也就是说存在“服务器是否就是发送请求中 URI 真正指定的主机,返回的响应是否真的返回到实际提出请求的客户端”等类似问题。
任何人都可发起请求
在 HTTP 协议通信时,由于不存在确认通信方的处理步骤,任何人都可以发起请求。另外,服务器只要接收到请求,不管对方是谁都会返回一个响应(但也仅限于发送端的 IP 地址和端口号没有被 Web 服务器设定限制访问的前提下)。
HTTP 协议的实现本身非常简单,不论是谁发送过来的请求都会返回响应,因此不确认通信方,会存在
以下各种隐患。
- 无法确定请求发送至目标的 Web 服务器是否是按真实意图返回响应的那台服务器。有可能是
已伪装的 Web 服务器。 - 无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。有可能是已伪装的
客户端。 - 无法确定正在通信的对方是否具备访问权限。因为某些 Web 服务器上保存着重要的信息,只
想发给特定用户通信的权限。 - 无法判定请求是来自何方、出自谁手。
- 即使是无意义的请求也会照单全收。无法阻止海量请求下的 DoS 攻击( Denial of Service,
拒绝服务攻击)。
查明对手的证书
虽然使用 HTTP 协议无法确定通信方,但如果使用 SSL 则可以。 SSL 不仅提供加密处理,而且还使用
了一种被称为证书的手段,可用于确定方。证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。另外,伪造证书从技术角度来说是异常困难的一件事。所以只要能够确认通信方(服务器或客户端)持有的证书,即可判断通信方的真实意图。
通过使用证书,以证明通信方就是意料中的服务器。这对使用者个人来讲,也减少了个人信息泄露的危
险性。另外,客户端持有证书即可完成个人身份的确认,也可用于对 Web 网站的认证环节。
7.1.3 无法证明报文完整性,可能已遭篡改
所谓完整性是指信息的准确度。若无法证明其完整性,通常也就意味着无法判断信息是否准确。
接收到的内容可能有误:没有任何办法确认,发出的请求 / 响应和接收到的请求 / 响应是前后相同的。比如,从某个 Web 网站上下载内容,是无法确定客户端下载的文件和服务器上存放的文件是否前后一致的。文件内容在传输途中可能已经被篡改为其他的内容。即使内容真的已改变,作为接收方的客户端也是觉察不到的。像这样,请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击(Man-in-the-Middle attack, MITM)。
如何防止篡改
提供文件下载服务的 Web 网站也会提供相应的以 PGP(Pretty Good Privacy,完美隐私)创建的数字
签名及 MD5 算法生成的散列值。 PGP 是用来证明创建文件的数字签名, MD5 是由单向函数生成的散列值。不论使用哪一种方法,都需要操纵客户端的用户本人亲自检查验证下载的文件是否就是原来服务器上的文件。浏览器无法自动帮用户检查。
可惜的是,用这些方法也依然无法百分百保证确认结果正确。因为 PGP 和 MD5 本身被改写的话,用户
是没有办法意识到的。
为了有效防止这些弊端,有必要使用 HTTPS。 SSL 提供认证和加密处理及摘要功能。仅靠 HTTP 确保
完整性是非常困难的,因此通过和其他协议组合使用来实现这个目标。
7.2 HTTP+ 加密 + 认证 + 完整性保护 =HTTPS
7.2.1 HTTP 加上加密处理和认证以及完整性保护后即是 HTTPS
我们把添加了加密及认证机制的 HTTP 称为 HTTPS(HTTP Secure)。
7.2.2 HTTPS 是身披 SSL 外壳的 HTTP
HTTPS 并非是应用层的一种新协议。只是 HTTP 通信接口部分用 SSL(Secure Socket Layer)和 TLS(Transport Layer Security)协议代替而已。通常, HTTP 直接和 TCP 通信。当使用 SSL 时,则演变成先和 SSL 通信,再由 SSL 和 TCP 通信了。简言之,所谓 HTTPS,其实就是身披 SSL 协议这层外壳的 HTTP。
7.2.3 相互交换**的公开**加密技术
SSL 采用一种叫做公开**加密( Public-keycryptography)的加密处理方式。加密方法中加密算法是公开的,而**却是保密的。通过这种方式得以保持加密方法的安全性。加密和解密都会用到**。没有**就无法对密码解密,反过来说,任何人只要持有**就能解密了。如果**被攻击者获得,那加密也就失去了意义。
共享**加密的困境:加密和解密同用一个**的方式称为共享**加密(Common key crypto system),也被叫做对称**加密。
使用两把**的公开**加密
公开**加密方式很好地解决了共享**加密的困难。
公开**加密使用一对非对称的**。一把叫做私有**(private key),另一把叫做公开**(public
key)。顾名思义,私有**不能让其他任何人知道,而公开**则可以随意发布,任何人都可以获得。
使用公开**加密方式,发送密文的一方使用对方的公开**进行加密处理,对方收到被加密的信息
后,再使用自己的私有**进行解密。
HTTPS 采用混合加密机制
在交换**环节使用公开**加密方式,之后的建立通信交换报文阶段则使用共享**加密方式。
7.2.4 证明公开**正确性的证书
首先,服务器的运营人员向数字证书认证机构提出公开**的申请。数字证书认证机构在判明提出申请者的身份之后,会对已申请的公开**做数字签名,然后分配这个已签名的公开**,并将该公开**放入公钥证书后绑定在一起。
服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,以进行公开**加密方式通信。公钥证书也可叫做数字证书或直接称为证书。
接到证书的客户端可使用数字证书认证机构的公开**,对那张证书上的数字签名进行验证,一旦验证通过,客户端便可明确两件事:一,认证服务器的公开**的是真实有效的数字证书认证机构。二,服务器的公开**是值得信赖的。
7.2.5 HTTPS 的安全通信机制
-
步骤 1: 客户端通过发送 Client Hello 报文开始 SSL 通信。报文中包含客户端支持的 SSL 的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及**长度等)。
-
步骤 2: 服务器可进行 SSL 通信时,会以 Server Hello 报文作为应答。和客户端一样,在报文中包含 SSL版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。
-
步骤 3: 之后服务器发送 Certificate 报文。报文中包含公开**证书。
-
步骤 4: 最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL 握手协商部分结束。
-
步骤 5: SSL 第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。报文中包含通信加密中
使用的一种被称为 Pre-master secret 的随机密码串。该报文已用步骤 3 中的公开**进行加密。 -
步骤 6: 接着客户端继续发送 Change Cipher Spec 报文。该报文会提示服务器,在此报文之后的通信会采用 Pre-master secret **加密。
-
步骤 7: 客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
-
步骤 8: 服务器同样发送 Change Cipher Spec 报文。
-
步骤 9: 服务器同样发送 Finished 报文。
-
步骤 10: 服务器和客户端的 Finished 报文交换完毕之后, SSL 连接就算建立完成。当然,通信会受到 SSL的保护。从此处开始进行应用层协议的通信,即发送 HTTP 请求。
-
步骤 11: 应用层协议通信,即发送 HTTP 响应。
-
步骤 12: 最后由客户端断开连接。断开连接时,发送 close_notify 报文。上图做了一些省略,这步之后再发送 TCP FIN 报文来关闭与 TCP 的通信。在以上流程中,应用层发送数据时会附加一种叫做 MAC(Message Authentication Code)的报文摘要。MAC 能够查知报文是否遭到篡改,从而保护报文的完整性。
下面是对整个流程的图解。图中说明了从仅使用服务器端的公开**证书(服务器证书)建立 HTTPS 通信的整个过程。
- SSL 和 TLS:HTTPS 使用 SSL(Secure Socket Layer) 和 TLS(Transport Layer Security)这两个协议。
- SSL 速度慢吗:
针对速度变慢这一问题,并没有根本性的解决方案,我们会使用 SSL 加速器这种(专用服务器)硬件来
改善该问题。该硬件为 SSL 通信专用硬件,相对软件来讲,能够提高数倍 SSL 的计算速度。仅在 SSL
处理时发挥 SSL 加速器的功效,以分担负载。