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 协议的交互过程和报文内容,研究二者的工作原理及异同之处。

HTTP 协议分析

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

建立 TCP 连接

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

1

从图中可以清楚地看到建立 TCP 连接的三个报文:客户端发出的连接请求报文中 SYN=1,服务器发出的确认报文中 SYN=1 且 ACK=1,最后客户端发出的确认报文中 ACK=1。

分析 HTTP 报文

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

2

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

值得注意的是,报文中传输的数据都是以明文显示的。为了更加清楚地说明这一点,我们可以在该网站上注册一个账号并登录,然后分析与登录操作相关的报文。

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)申请证书。一般免费证书较少,因而需要一定费用。
posted @ 2020-07-15 23:12  TimDyh  阅读(481)  评论(0编辑  收藏  举报