前言
这篇文章首发于我的个人语雀,欢迎访问🔗 Yuque | XieChen。
我也是一个不断学习的开发者,如果你在文档中发现任何错误或有任何疑问,欢迎在评论区指出或一起交流讨论!你的反馈对我来说非常重要,也能帮助更多人理解这个内容 😊。
也非常欢迎能关注我的语雀,这将为我提供更多学习的动力!
什么是 HTTPS?
因为 HTTP 请求的过程中是明文传输的,例如当你在浏览器中输入一个网址并按下回车键时,你的计算机会向服务器发送一个 HTTP 请求。这个请求包含了你想要访问的网页的 URL,以及可能包含的其他信息,如你的浏览器类型、操作系统等。如果这个请求没有通过 HTTPS 传输,那么这些信息就可以被网络中的其他设备(如中间的路由器、Wi-Fi 热点等)轻易地读取。
HTTPS 是基于 SSL/TLS 协议的,HTTPS 和 HTTP 本质上是一样的,只不过 HTTPS 是在 HTTP 的基础上加了一层「安全层」。
SSL (Secure Sockets Layer) 和 TLS (Transport Layer Security) 是加密协议,它们用于保护网络通信的安全性。SSL 是 TLS 的前身,TLS 是 SSL 的后续版本,TLS 在 SSL 的基础上进行了很多改进和增强,所以现在 HTTPS 使用的是 TLS 协议。
大致的工作流程:
- 客户端发起 HTTPS 请求(如访问 example.com)。
- 服务器返回其数字证书(由 CA 签发)。
- 客户端验证证书有效性。
- 双方通过 TLS 协议协商加密密钥,建立安全通道。
- 后续通信通过对称加密进行。
CA 机构
HTTPS 的核心就是这个 CA (Certificate Authority)证书颁发机构。它是一种权威的机构,当客户端接收到服务端返回的证书后会给整个证书进行校验。证书一般需要进行购买。
证书的颁发流程:
- 服务端会向 CA 结构申请一个证书,需要将服务端的「公钥」提供给 CA 机构;
一个证书的组成大致有以下几个内容:
- 网站的域名;
- 颁发证书的 CA 机构;
- 使用 CA 机构私钥「加密后」的服务器公钥;
- 使用 CA 机构私钥「加密后」的证书签名。证书的签名是由下面的部分组成的:
- 网站的域名;
- CA 的公钥;
- 服务端的公钥;
然后 HTTP 的请求就会变得安全:
- 当客户端首次请求服务端的时候,服务端会返回给客户端一个证书;
- 由于 CA 机构的公钥全世界都知道的,所以客户端可以自行对证书的签名进行校验;
签名一般使用的都是摘要/哈希/散列,使用这种算法加密后的内容是不可逆的。所以使用的场景一般是对比内容。例如将得到的数据,使用同样的算法对数据在进行一次加密,看看本次的加密和之前的加密字符层是否匹配。
- 当证书验证通过后,客户端和服务端之间通信都是使用「私钥」加密传输;
基于此,中间人就只能想办法破解证书。但即使是中间人获取了证书的内容,例如更改了更改了证书中服务端的公钥,但是因为中间人不知道 CA 的私钥,因此无法加密篡改后的公钥,客户端就会验证不通过,并提示用户网站存在风险。
漏洞
难道 HTTPS 真的就可以完全防范中间人攻击了吗?
答案是不一定。
针对 HTTPS 中间人还有两种破解办法:
1、SSL/TLS 攻击。
这种攻击是指攻击者劫持了客户端和服务器之间的连接,将服务器的合法证书替换为伪造的证书,并且想办法让用户信任这个假的证书(例如病毒、恶意软件、诱导等等),从而获取客户端和服务器之间传递的信息。这种方式一般容易被用户发现,浏览器会明确的提示证书错误,但某些用户安全意识不强,可能会点击继续浏览,从而达到攻击目的。
2、SSL 剥离攻击。
这种攻击是指攻击者劫持了客户端和服务器之间的连接,攻击者保持自己和服务器之间的 HTTPS 连接,但发送给客户端普通的 HTTP 连接,由于 HTTP 连接是明文传输的,即可获取客户端传输的所有明文数据。