网络安全课程笔记八:SSL/TLS and HTTPS

Network Security Lecture 8: SSL/TLS AND HTTPS

8.1 公开密钥基础建设

如何验证某个实体的公钥和其私钥是一对密钥?或者说,如何验证某个实体向互联网声明的公钥确实是他自己的公钥?

公开密钥基础建设(英语:Public Key Infrastructure,缩写:PKI),又称公开密钥基础架构、公钥基础建设、公钥基础设施、公开密码匙基础建设或公钥基础架构,是一组由硬件、软件、参与者、管理政策与流程组成的基础架构,其目的在于创造、管理、分配、使用、存储以及撤销数字证书。

将公钥和特定实体的绑定是由认证中心(Certificate Authority,CA)完成的,CA 具有以下作用:

  • 证实一个实体的真实身份
  • 一旦 CA 验证了某个实体的身份,CA 会生成一个将其身份和其实体的公钥绑定起来的证书(certificate)

一个证书包含几个主要的字段:

  • 证书序列号:一个独一无二的 ID
  • 签名算法标识符:CA 给这个证书签名用到的算法
  • 证书颁发者名称
  • 证书有效期
  • 证书所有者名称
  • 证书所有者的公钥、公钥长度、公钥类型
  • CA 给这个证书的数字签名

8.1.1 CA Hierarchy

互联网中的实体数量极多,一个 CA 肯定不能胜任如此繁重的验证事务,要由分布在全球各地的 CAs 来完成。

CAs 数量一多,就会引发新的问题:如何确定 CA 的真实身份呢?会不会有人假冒一个 CA,给自己颁发一个证书呢?

于是 CAs 被组织成了一个树状结构,如同 DNS 服务器组织结构一样。根结点被称为根证书颁发机构(Root CA),它拥有根证书(Root Certificate)。其他所有的 CA 都是树中的结点,孩子结点的证书由其父亲签名、颁发、验证。

如果要验证一个 CA 的真实身份,只要向上查询、验证其父亲的身份,依次直到 Root CA,形成了一个证书链,Root Certificate 是这个证书链的起点。

Root CA 自签一张新的根证书时,需要产生一对公开密钥及私有密钥,这个过程在公证人、律师及录影系统监察下经过一系列严谨的程序,在高度防护的设施内进行。全球的 Root CA 数量并不多,在维基百科有列表:https://en.wikipedia.org/wiki/Certificate_authority

8.1.2 Certificate Revocation

证书会在其到期之后失效。但是有时会由于其他原因,需要在证书到期之前就将其撤销:

  • 用户的私钥被认为已泄露
  • CA 的私钥被认为已泄露
  • 用户不再被 CA 信任

为了完成这一操作,每个 CA 都必须存储一个包含由其发放的被撤销的未到期的的证书列表,称为证书撤销列表(Certificate Revocation List,CRL)。用户得到证书时,必须确定证书是否已被撤销。

8.2 SSL

SSL 的体系结构中包含两个协议子层,其中底层协议是 SSL 记录协议(SSL Record Protocol),高层协议是 SSL 握手协议(SSL HandShake Protocol)、SSL 修改密码规范协议(SSL Change Cipher Spec Protocol)、SSL 警报协议(SSL Alert Protocol),和 HTTP 等其他应用层协议。

SSL 握手协议(SSL Handshake Protocol):它建立在 SSL 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

8.2.1 会话和连接

  • SSL 连接:用于提供某种服务类型的数据传输,是一种点对点的关系。一般来说,连接的维持时间比较短暂,并且每个连接一定与某一个会话相关联。
  • SSL 会话:是指客户和服务器之间的一个关联关系,通过握手协议来创建。它定义了一组密码安全参数,在多个安全连接之间共享。会话通常用来减少每次连接建立安全参数的昂贵协商费用。

客户端和服务器之间可能会有多对 SSL 连接。

SSL 会话状态包括以下几个常用参数:

  • 会话标识符(Session Identifier):服务器产生的用于标识活动或可恢复会话状态的一个任意字节序列
  • 对等实体证书(Peer Certificate):对等实体的 X.509 证书
  • 压缩方法(Compression Method)
  • 密码规格(Cipher Spec):指定数据加密方法(AES, DES…)和哈希方法(MD5, SHA-1…)
  • 主密钥(Master Secret):客户端和服务器共享的 48-Byte 密钥
  • 可恢复性(Is Resumable):会话是否可用于初始化新连接的标志

SSL 连接状态包括以下几个常用参数:

  • 服务器和客户端用于标识该连接的随机字节序列
  • 服务器加密密钥:用于从服务器到客户端的数据的加密密钥
  • 服务器 MAC 密钥:用于从服务器到客户端的数据的 MAC 密钥
  • 客户端加密密钥:用于从客户端到服务器的数据的加密密钥
  • 客户端 MAC 密钥:用于从客户端到服务器的数据的 MAC 密钥
  • 初始向量:如果使用 CBC 模式加密数据,则需要一个初始向量
  • 序号:双方都维护自己的序号(针对在该连接中传输的所有数据包的编号)

8.2.2 SSL 记录协议

SSL 能保证信息机密性和信息完整性:

  • 机密性:SSL 握手协议定义了一个共享密钥用来做对称加密
  • 完整性:SSL 握手协议定义了一个共享密钥用来计算 MAC

SSL 记录协议头包含以下字段:

  • 内容类型:指定上层协议的类型(change_cipher_spec, alert, handshake, 和 application_data
  • 主版本号
  • 次版本号
  • 压缩长度

为了防御重放攻击,SSL 也为每个记录维护一个序号(也就是 8.2.1 中介绍的 SSL 连接状态中的序号)。但是 SSL 并不直接在记录头包括一个序号,而是在计算 MAC 时包含该序号。现在该 MAC 是数据MAC 密钥当前序号的哈希值。

8.2.3 SSL 发送方工作流程

  1. 从上层接受要发送的数据(包括各种消息和数据)
  2. 对信息进行分段(Fragment)
  3. 使用指定的压缩算法进行数据压缩(可选)
  4. 计算 MAC 并附加到分段尾部
  5. 使用指定的加密算法进行数据加密(包含尾部 MAC)
  6. 添加 SSL 记录协议头,发送数据。

8.2.4 SSL 握手过程

这里只介绍基于 RSA 加密的握手过程:

第一阶段:

  1. 客户端通过 Client Hello 消息将它支持的密码算法列表、不重数(一个只会使用一次的随机数)等信息发送给服务器
  2. 服务器选择一种对称算法、一种公钥算法(此处仅讨论 RSA)、一种 MAC 算法。它把它的选择连同一个服务器不重数通过 Server Hello 消息通知给客户端

第二阶段:

  1. 服务器将携带自己公钥信息的数字证书通过 Certificate 消息发送给客户端
  2. 服务器发送 Server Hello Done 消息,通知客户端协商结束
  3. 客户端验证服务器的证书,提取证书中的公钥,生成一个 48-Byte 前主密钥(Pre-Master Secret,PMS),用服务器的公钥加密该 PMS 并发送给服务器
  4. 使用相同的密钥导出函数,服务器和客户端独立地从 PMS不重数中计算出主密钥(Master Secret,MS)(采用散列函数),随后该 MS 被切片以生成两个密码和两个 MAC 密钥(如果需要,IV 也会从 MS 生成)

第三阶段:

  1. 客户端发送 Change Cipher Spec 消息,通知服务器接下来的报文将全部使用协商好的算法进行验证和加密
  2. 客户端计算所有握手报文的一个 MAC,并通过 Finished 消息发送给服务器
  3. 服务器发送 Change Cipher Spec 消息,通知客户端接下来的报文将全部使用协商好的算法进行验证和加密
  4. 服务器计算所有握手报文的一个 MAC,并通过 Finished 消息发送给服务器

8.2.5 防御重放攻击

为什么要在握手时包含一个不重数?在 8.2.2 中已经提到,SSL 为每个记录维护一个序号来防御重放攻击,还不够吗?

假设一个攻击人嗅探到了客户端 A 和服务器 B 之间的所有报文。第二天,它冒充客户端 A,向服务器 B 发送和前一天 A 向 B 发送的相同的报文序列。假设握手没有使用不重数,那么服务器 B 将会和前一天一样回复完全相同的报文序列。它并不会怀疑 A 的身份,因为 A 发来的所有报文都通过了完整性检查。

另一方面,如果在握手时使用了不重数,由于主密钥(Master Secret,MS)是从 PMS不重数中计算出的,使得这两天使用的密钥完全不同。重放攻击将无法进行。

总之,SSL 中的不重数用来防御“连接重放”(攻击者重放整个会话过程),而 SSL 记录中的序号则用于防御在一个进行中的会话中重放个别分组

8.2.6 防御篡改攻击

为什么在握手的结束阶段,客户端和服务器要计算所有握手报文的一个 MAC 并发送给对方?

假设一个攻击者作为中间人,可以修改数据包而不被发现。由于第一阶段的握手数据包都是明文传输的,他可以从列表中删除一些较强的算法,迫使服务器选择较弱的算法。

为了防御这种篡改攻击,客户端和服务器会将所有握手报文的 MAC 发送给对方进行验证,任意一方验证失败都将结束连接。

8.3 HTTPS

超文本传输安全协议(Hypertext Transfer Protocol Secure,HTTPS)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。

8.3.1 HTTP 和 HTTPS 对比

HTTP 工作流程:

  • 在 Web 服务器的 80 端口打开一个 TCP 连接
  • 在此端口上接收、发送报文
  • 关闭 TCP 连接

HTTPS 工作流程:

  • 在 Web 服务器的 443 端口打开一个 TCP 连接
  • 初始化 SSL/TLS 层:商量密码学安全参数、交换密钥等
  • 在此端口上发送的报文将被加密后再交给 TCP
  • 关闭 SSL/TLS 连接
  • 关闭 TCP 连接

8.3.2 HTTPS 攻击

8.3.2.1 中间人攻击

将服务器的证书替换为攻击者自己伪造的证书。

如今大多数浏览器在证书验证失败后都会发出警告,但依然有很多人忽略警告继续访问。

8.3.2.2 SSL Strip

这种攻击基于大部分公众的上网习惯:很少有人手打 https://

人们通常经过两种方式使用 HTTPS 链接:

  • 点击给出的链接
  • 通过 HTTP 重定向(如 HTTP 302)

一种攻击方法:攻击者作为中间人,监控 HTTP 流量,将 <a herf="https://..."> 改成 <a herf="http://..."> 等,迫使用户使用 HTTP 连接。

另一种攻击方法:攻击者作为中间人,和服务器建立 HTTPS 连接,和用户建立 HTTP 连接。攻击者将用户通过 HTTP 发来的所有报文加密为 HTTPS 后转发给服务器,将服务器回复的 HTTPS 报文解密为 HTTP 转发给用户。