HTTPS 是如何保证传输安全的?

转自:
https://mp.weixin.qq.com/s/-l1zFpvx8VxdEC9JuTExCQ

HTTP 协议

在谈论 HTTPS 协议之前,先来回顾一下 HTTP 协议的概念。

HTTP 协议介绍

HTTP 协议是一种基于文本的传输协议,它位于 OSI 网络模型中的应用层。

在这里插入图片描述

HTTP 中间人攻击

HTTP 协议使用起来确实非常方便,但是它存在一个致命的缺点:不安全。

我们知道 HTTP 协议中的报文都是以明文方式进行传输的,不做任何加密,这样会导致什么问题呢?

  1. 小明在 JAVA 贴吧发帖,内容为我爱 JAVA

在这里插入图片描述

  1. 被中间人进行攻击,内容修改为我爱 PHP

在这里插入图片描述

可以看到在 HTTP 传输过程中,中间人能看到并且修改 HTTP 通讯中的所有的请求和响应内容,所以使用 HTTP 是非常不安全的。

防止中间人攻击

这个时候可能就有人想到了,既然内容是明文的,那我使用对称加密的方式将报文加密,这样中间人不就看不到明文了吗?

  1. 双方约定加密方式

在这里插入图片描述

  1. 使用 AES 加密报文

在这里插入图片描述

这样看似中间人获取不到明文信息,但其实在通讯过程中,还是会以明文方式暴露加密方式和秘钥。如果第一次通信就被拦截了,那么秘钥就会泄露给中间人,中间人仍然可以解密后续的通信。

在这里插入图片描述

对于这种情况,能不能将秘钥进行加密不让中间人看到呢?

可以的,采用非对称加密,我们可以通过 RSA 算法来实现。

  1. 在约定加密方式的时候,由服务器生成一对公私钥,服务器将公钥返回给客户端
  2. 客户端本地生成一串秘钥(AES_KEY)用于对称加密,并通过服务器发送的公钥进行加密得到(AES_KEY_SECRET),之后返回给服务端
  3. 服务端通过私钥将客户端发送的 AES_KEY_SECRET 进行解密得到 AES_KEY,最后客户端和服务器通过 AES_KEY 进行报文的加密通讯

在这里插入图片描述

在这种情况下,中间人是窃取不到用于 AES 加密的秘钥,所以对于后续的通讯是肯定无法进行解密了,那么这样做就是绝对安全了吗?

所谓道高一尺魔高一丈,中间人为了应对这种加密方法,又想出了一个新的破解方案,既然拿不到 AES_KEY,那么我就把自己模拟成一个客户端和服务器的结合体。在用户 -> 中间人的过程中,中间人模拟服务器的行为,这样就可以拿到用户请求的明文;在中间人 -> 服务器的过程中,中间人模拟客户端的行为,这样就可以拿到服务器响应的明文,以此来进行中间人攻击。

在这里插入图片描述

第一次通信再次被中间人截获,中间人自己也伪造了一对公私钥,并将公钥发送给用户以此来窃取客户端生成的 AES_KEY,在拿到 AES_KEY 之后就能轻松地进行解密了。

中间人这样为所欲为,就没有办法制裁下吗?

接下来我们看看 HTTPS 是如何解决通讯安全问题的。

HTTPS 协议

HTTPS 简介

HTTPS 其实是 SSL + HTTP 的简称,当然现在 SSL 基本已经被 TLS 取代了,不过接下来我们还是统一以 SSL 作为简称,SSL 协议其实不止是应用在 HTTP 协议上,还应用在各种应用层协议上,例如:FTP、WebSocket。

其实 SSL 协议大致和非对称加密的性质一样,握手的过程主要也是为了交换秘钥,然后在通讯过程中使用对称加密来进行通讯。

在这里插入图片描述

这里只是画了个示意图,其实真正的 SSL 握手会比这个复杂地多,但是性质还是差不多,而且我们需要关注的重点在于 HTTPS 是如何防止中间人攻击的。

通过上图可以观察到,服务器是通过 SSL 证书来传递公钥的,客户端会对 SSL 证书进行验证,其中证书认证体系就是确保 SSL 安全的关键。

CA 认证体系

上一节我们看到客户端需要对服务器返回的 SSL 证书进行校验,那么客户端是如何校验服务器 SSL 证书的安全性的呢?

  • 权威认证机构。在 CA 认证体系中,所有的证书都是由权威机构来颁发,而权威机构的 CA 证书都已经在操作系统中内置了,我们把这些证书称之为 CA 根证书

在这里插入图片描述

  • 签发证书。服务器如果想要使用 SSL,需要通过权威认证机构来签发 CA 证书,我们将服务器生成的公钥和站点的相关信息发送给 CA 签发机构,再由 CA 签发机构通过服务器发送的相关信息进行加签,由此得到服务器的证书,证书会对应生成证书内容的签名,并将该签名使用 CA 签发机构的私钥进行加密得到证书指纹,并且与上级证书生成关系链。

在这里插入图片描述

在这里插入图片描述

可以看到,百度是受信于 GlobalSign G2 的,同样的 GlobalSign G2 是受信于 GlobalSign R1 的,当客户端(浏览器)做证书校验时,会一级一级向上检查,直到最后的根证书,如果没有问题,就说明服务器证书是可以被信任的。

如何验证服务器证书?

首先会通过层级关系找到上级证书,通过上级证书里的公钥来对服务器的证书指纹进行解密得到签名(sign1),再通过签名算法算出服务器证书的签名(sign2),对比 sign1 和 sign2,如果相等,就说明证书是没有被篡改过的,也不是伪造的。

在这里插入图片描述

证书校验用的 RSA 是通过私钥加密证书签名,公钥解密来巧妙地验证证书的有效性。

这样通过证书的认证体系,就可以避免中间人窃取 AES_KEY,从而发起拦截和修改 HTTP 通讯的报文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值