HTTP 与 HTTPS 协议分析

万维网客户程序与万维网服务器程序之间的交互遵照严格的协议,这就是超文本传输协议 HTTP(HyperText Transfer Protocol)。HTTP 是一个应用层协议,它使用 TCP 链接进行可靠的传送。算法

安全套接字层 SSL(Secure Socket Layer) 和运输层安全 TLS(Transport Layer Security)是如今普遍使用的两个安全协议,做用在端系统应用层的 HTTP 和运输层之间,在 TCP 之上创建起一个安全通道,为经过 TCP 传输的应用层数据提供安全保障。安全

超文本传输安全协议 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)在 HTTP 的基础上加入 SSL 层,经过传输加密和身份认证保证了传输过程的安全性。服务器

本次实验使用 Wireshark 报文分析软件,分别经过分析 HTTP 和 HTTPS 协议的交互过程和报文内容,研究两者的工做原理及异同之处。session

HTTP 协议分析

HTTP 协议使用了面向链接的 TCP 协议做为运输层协议,保证了数据的可靠传输。具体来讲,HTTP 协议首先要和服务器创建 TCP 链接,这须要使用三报文握手。当创建 TCP 链接的三报文握手的前两部分完成后,万维网客户就把 HTTP 请求报文,做为创建 TCP 链接的三报文握手中的第三个报文的数据,发送给万维网服务器。服务器收到 HTTP 请求报文后,就把所请求的文档做为响应报文返回给客户。dom

创建 TCP 链接

咱们首先经过实验验证创建链接的过程。这里咱们选择一个使用 HTTP 协议的网站“C语言中文网”( http://c.biancheng.net/ )进行访问,而后在 Wireshark 软件中过滤出涉及该网站 IP 地址的报文。tcp

1

从图中能够清楚地看到创建 TCP 链接的三个报文:客户端发出的链接请求报文中 SYN=1,服务器发出的确认报文中 SYN=1 且 ACK=1,最后客户端发出的确认报文中 ACK=1。网站

分析 HTTP 报文

TCP 链接创建成功后,客户端就会发送 HTTP 请求报文,服务器收到后也发回了响应报文,以下图所示。ui

2

能够看到,请求报文中包含方法、URL、版本等字段,而响应报文中包含状态码、实体主体等字段。加密

值得注意的是,报文中传输的数据都是以明文显示的。为了更加清楚地说明这一点,咱们能够在该网站上注册一个帐号并登陆,而后分析与登陆操做相关的报文。.net

3

咱们找到提交登陆表单的报文,这条报文使用了 POST 方法,将用户登陆所需的认证信息发送给服务器。能够清楚地看到,报文中包含明文的 username 和 password 字段,显然这是不安全的。

HTTPS 协议分析

为了解决上述问题,使传输的过程更加安全,HTTPS 利用 SSL 层对会话进行加密,并提供身份认证和消息认证等安全服务。具体来讲,在创建 TCP 链接以后,客户端与服务器先进行握手协议,完成加密算法的协商和会话密钥的传递,而后进行安全数据传输。

下面经过分析访问 HTTPS 网站时的报文截获状况,重点研究握手的过程。这里以百度( https://www.baidu.com/ )为例。

4

从图中能够大体总结出握手的基本流程:

  1. 客户端 -> 服务器:Client Hello
  2. 客户端 <- 服务器:Server Hello
  3. 客户端 <- 服务器:Certificate
  4. 客户端 <- 服务器:Server Key Exchange, Server Hello Done
  5. 客户端 -> 服务器:Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
  6. 客户端 <- 服务器:Change Cipher Spec, Encrypted Handshake Message

下面咱们详细分析每一步中报文的具体内容。

1. Client Hello

Client Hello 用于首次链接服务器时,或响应服务器发送的 Hello Request,或主动发送,以便从新协商链接中的安全参数。报文中携带了 TLS 协议版本号(Version)、一个随机数(Random)、客户端支持的加密套件(Cipher Suites)、压缩算法(Compression Methods)等。

5

2. Server Hello

该类型的消息用于响应 Client Hello 消息。若是服务器找到一组能够接受的算法套件时,则回复此消息,不然响应握手失败的警报。这里服务器返回协商的信息,肯定了使用哪一种加密套件和压缩方法等。此外,服务器也生成了一个随机数。

6

3. Certificate

该消息紧跟在 Server Hello 消息后,用于向客户端下发证书。能够看到证书的类型是 X.509v3。

7

4. Server Key Exchange, Server Hello Done

此消息在 Certificate 消息后当即发送,包含 Diffie-Hellman 算法的相关参数,以及服务器使用该秘钥交换算法所计算出来的公钥。此外,服务器为了证实此消息是真实可靠的,须要使用本身证书的私钥,并从 Client Hello 中提供的扩展 signature_algorithms 里选择合适的摘要和签名算法,对参数进行签名。

传递完这些参数以后,服务器发送 Server Hello Done,表示已经把支持秘钥交换的消息发送完成,而后等待客户端响应。

8

5. Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message

客户端根据上一步服务器传来的公钥,生成预主密钥(pre-master key),而后经过 Client Key Exchange 将其传给服务器。服务器用本身的私钥解出这个预主密钥的信息,获得第三个随机数。到目前为止,客户端和服务器都拥有了三个随机数。因而两边根据这三个随机数以及 D-H 算法的相关参数生成一个会话密钥(session key),后续就使用这个密钥进行通讯。

Change Cipher Spec 用于通知服务器后续的通信数据将在新协商的秘钥规范保护下交换。

Encrypted Handshake Message 是客户端将前面的握手消息生成摘要再用协商好的秘钥加密获得的,这是客户端发出的第一条加密消息。服务端接收后会用秘钥解密,能解出来讲明前面协商出来的秘钥是一致的。

9

6. Change Cipher Spec, Encrypted Handshake Message

同上,若是服务器经过 D-H 算法可以解密摘要,那么应该告知客户端协商的会话密钥是一致的。

10

至此,握手的过程就算结束了,这之后的数据都会经过创建好的加密信道进行传输。

11

能够看到,Application Data 报文中的数据都是通过加密的,在必定程度上保证了通讯的安全。

HTTP 与 HTTPS 的区别

  • HTTP 以明文传输,安全性较差;HTTPS 的传输过程是加密的,安全性较好。
  • HTTP 使用 80 端口;HTTPS 使用 443 端口。
  • HTTP 使用 TCP 三次握手创建链接,客户端和服务器须要交换 3 个包;HTTPS 除了 TCP 的 3 个包,还要加上 SSL 握手须要的 9 个包,因此一共是 12 个包。正由于此,HTTPS 比 HTTP 须要更大的开销,页面响应速度也相对慢一些。
  • 使用 HTTPS 协议须要向数字证书认证机构 CA(Certificate Authority)申请证书。通常免费证书较少,于是须要必定费用。
相关文章
相关标签/搜索