SSL、TLS、HTTPS 的关系

  • SSL(Secure Sockets Layer,安全套接字协议)
  • TLS(Transport Layer Security,传输层安全性协议)
  • HTTPS(Hyper Text Transfer Protocol over SecureSocket Layer,建立在 SSL 协议之上的 HTTP 协议)

TLS 是 SSL 的升级版,两者几乎是一样的

HTTPS 的引入

HTTP 明⽂传输的特性

中间人攻击

中间人攻击(Man-in-the-Middle Attack,简称MITM),是一种会话劫持攻击。攻击者作为中间人,劫持通信双方会话并操纵通信过程,而通信双方并不知情,从而达到窃取信息或冒充访问的目的。常见的攻击方式有 Wi-Fi 仿冒、邮件劫持、DNS 欺骗、SSL 劫持等

具体来讲,在将 HTTP 数据提交给 TCP 层之后,数据会经过⽤⼾电脑、WiFi 路由器、运营商和⽬标服务器,在这中间的每个环节中,数据都有可能被窃取或篡改

网络劫持

  1. DNS劫持:打开某网站却被强制跳转到其它网站
    • DNS 强制解析:修改运营商的本地 DNS 记录
    • 302 跳转的⽅式
  2. HTTP劫持:访问某网站但是⼀直有其它网站的⼴告
    • 由于 HTTP 明⽂传输,运营商会修改你的http响应内容(加⼴告)

在 HTTP 协议栈中引⼊安全层

安全层有两个主要的职责:

  1. 对发起 HTTP 请求的数据进⾏加密
  2. 对接收到 HTTP 的内容进⾏解密

第⼀版:使⽤对称加密

对称加密:加密和解密都使⽤相同的密钥

⾸先协商加解密⽅式,这个过程就是 HTTPS 建⽴安全连接的过程。为了让加密的密钥更加难以破解,让服务器和客⼾端同时决定密钥

问题:

⿊客可以拿到协商的加密套件和双⽅的随机数,由于利⽤随机数合成密钥的算法是公开的,所以⿊客拿到随机数之后,也可以合成密钥,这样数据依然可以被破解

第⼆版:使⽤⾮对称加密

⾮对称加密算法有 A、B 两把密钥,⽤ A 密钥来加密,只能使⽤B 密钥来解密,反之亦然

服务器将其中⼀个密钥(公钥)通过明⽂的形式发送给浏览器,服务器⾃⼰留下的密钥称为私钥

公钥是每个⼈都能获取到的,⽽私钥只有服务器知道,不对任何⼈公开

问题:

  1. ⾮对称加密的效率太低,会严重影响加解密数据的速度,进⽽影响打开⻚⾯的速度
  2. ⽆法保证服务器发送给浏览器的数据安全,私钥加密只有公钥能解密,但⿊客也可以获取到公钥,从而解密服务器发送的数据

第三版 :对称加密和⾮对称加密搭配使⽤

在传输数据阶段使⽤对称加密,对称加密的密钥采⽤⾮对称加密来传输

问题:

虽然完美地实现了数据的加密传输,但无法确定服务器是否为真

比如⿊客通过 DNS 劫持将 IP 地址替换成了⿊客的 IP 地址,这样访问的其实是⿊客的服务器,⿊客就可以在⾃⼰的服务器上实现公钥和私钥,⽽对浏览器来说,它完全不知道现在访问的是个⿊客的站点

第四版:添加数字证书

需要服务器向浏览器提供证明“我就是我”:通过权威机构 CA(Certificate Authority)颁发数字证书(Digital Certificate)

对于浏览器来说,数字证书有两个作⽤:

  1. 通过数字证书向浏览器证明服务器的⾝份
  2. 数字证书⾥⾯包含了服务器公钥

服务器没有直接返回公钥给浏览器,⽽是返回数字证书,公钥包含在数字证书中;在浏览器端多了⼀个证书验证的操作,验证了证书之后,才继续后续流程

数字证书的申请和验证

如何申请数字证书:

  1. 需要准备⼀套私钥和公钥,私钥留着⾃⼰使⽤
  2. 向 CA 机构提交公钥、公司、站点等信息并等待认证(这个认证过程可能是收费的)
  3. CA 通过线上、线下等多种渠道来验证所提供信息的真实性(如公司是否存在、企业是否合法、域名是否归属该企业等)
  4. 如信息审核通过,CA 会签发认证的数字证书,包含了该网站的公钥、组织信息、CA 的信息、有效时间、证书序列号等,这些信息都是明⽂的,同时包含⼀个 CA ⽣成的签名

数字签名的生成:

  1. CA 使⽤ Hash 来计算提交的明⽂信息,并得出信息摘要
  2. 使⽤CA 的私钥对信息摘要进⾏加密,加密后的密⽂就是数字签名

数字签名的作用:

  • 通过数字签名可以验证服务器的真实性
  • 同样也可以通过数字签名来验证是否是该 CA 颁发的

浏览器如何验证数字证书:

当浏览器向服务器发出请求,服务器会返回数字证书给浏览器,浏览器接收到数字证书后,会对数字证书进⾏验证

  1. 浏览器读取证书中相关的明⽂信息,采⽤ CA 签名时相同的 Hash 函数来计算并得到信息摘要 A
  2. 再利⽤对应 CA 的公钥解密签名数据,得到信息摘要 B
  3. 对⽐信息摘要 A 和信息摘要 B,如果⼀致,则可以确认证书是合法的;同时浏览器还会验证证书相关的域名信息、有效时间等信息

这时候相当于验证了 CA 是谁,但是这个 CA 可能⽐较⼩众,浏览器不知道该不该信任它,浏览器会继续查找给这个 CA 颁发证书的 CA,再以同样的⽅式验证它上级 CA 的可靠性。通常情况下,操作系统中会内置信任的顶级 CA 的证书信息(包含公钥),如果这个 CA 链中没有找到浏览器内置的顶级的 CA,证书也会被判定⾮法

注意点:

  • 申请数字证书是不需要提供私钥的,要确保私钥永远只能由服务器掌握
  • 数字证书最核⼼的是 CA 使⽤它的私钥⽣成的数字签名
  • 内置 CA 对应的证书称为根证书,根证书是最权威的机构,它们⾃⼰为⾃⼰签名,把这称为⾃签名证书

HTTPS 握手过程

  1. 客户端请求服务器,并告诉服务器自身支持的加密算法以及密钥长度等信息
  2. 服务器响应公钥和服务器证书
  3. 客户端验证证书是否合法,然后生成一个会话密钥,并用服务器的公钥加密密钥,把加密的结果通过请求发送给服务器
  4. 服务器使用私钥解密被加密的会话密钥并保存起来,然后使用会话密钥加密消息响应给客户端,表示自己已经准备就绪
  5. 客户端使用会话密钥解密消息,知道了服务器已经准备就绪。
  6. 后续客户端和服务器使用会话密钥加密信息传递消息

握手过程中,客户端如何验证证书的合法性:

  1. 校验证书的颁发机构是否受客户端信任。
  2. 通过 CRL 或 OCSP 的方式校验证书是否被吊销。
  3. 对比系统时间,校验证书是否在有效期内。
  4. 通过校验对方是否存在证书的私钥,判断证书的网站域名是否与证书颁发的域名一致。

HTTPS 中间人攻击

针对 HTTPS 攻击主要有 SSL 劫持攻击和 SSL 剥离攻击两种:

  1. SSL 劫持攻击:攻击者劫持了客户端和服务器之间的连接,将服务器的合法证书替换为伪造的证书,从而获取客户端和服务器之间传递的信息。这种方式一般容易被用户发现,浏览器会明确的提示证书错误,但某些用户安全意识不强,可能会点击继续浏览,从而达到攻击目的。
  2. SSL 剥离攻击:攻击者劫持了客户端和服务器之间的连接,攻击者保持自己和服务器之间的 HTTPS 连接,但发送给客户端普通的 HTTP 连接,由于 HTTP 连接是明文传输的,即可获取客户端传输的所有明文数据。