聊聊 HTTPS

聊聊 HTTPS

本文写于 2021 年 6 月 30 日

最近工作也是越来越忙了,不像上学的时候,一天下来闲着没事可以写两篇博客。

今天来聊一下 HTTPS。

HTTP

HTTP 是不安全的协议。

有面试题可能会问你:“HTTP 的 Get 和 Post 方法谁安全?”注意,别上当了,他们都不安全——因为 HTTP 是明文传输的。

关于 HTTP 应该大家都非常的熟悉,就不多介绍了。

如何保证安全

假设我们在古代,有人寄出了一封密信,我们能对这封信做些什么呢?

  1. 我们可以偷看这封信;
  2. 可以掉包这封信。

HTTP 协议就像送信一样,黑客可以通过这两种手段来工具我们的连接。

所以基于这个例子,我们想到了一个简单的方法来防范:加密这封信,只有服务器和客户端能看懂,这样即使中间被人偷看了也无妨。

对称加密

例如我们约定好,都拿新华字典这本书作为对照,我信中写的 22|31 就是第 22 页的第 31 个字。这样我就可以先写一封信,对照着新华字典将其变为加密的形式,等你拿到这封信的时候,再对着新华字典解开这封信。这样,就可以轻松的防范别人偷窥我们了。

这就叫做对称加密,也就是说,加密方和解密方用的密钥是一样的。

但是这种方法存在一个问题。如果是服务器之间的通信,那我可以在两边的程序里事先写好我们的“新华字典”,但是浏览器,或者说客户端怎么办?

我这个加密用的书怎么样才能通知到客户端呢?

通知不到呀,因为这个密钥万一被劫持了怎么?那不就相当于没有加密吗。

非对称加密

这个时候我们就想,那我不如这样:

假设我们要传递 9527141 这串数字,我就将他写成 92741,然后再写一句“第一个是你的银行密码的第 2 位,第二个是你的银行密码的第 7 位”。

诶,这样一来,对于写信人来说,是自己定义的加密,而收信人并不知道怎么加密,只知道怎么解密,但它用来解密的密钥,又不被其他人所知道。

这就叫做非对称加密。

我们把这个密钥分为一对,服务器将公钥发给客户端,并使用私钥加密,客户端通过公钥解密即可。

在第一次交换数据之后,客户端就可以生成一个随机的密钥,传回给服务端,此时就又可以用对称加密来解决问题了。

但这个时候还没有解决第二个送信问题——被人掉包了怎么办?

黑客掉包了服务器下发给你的公钥,你用他的公钥加密完了数据,他能直接用自己的私钥解开,那信息还是会泄露的呀。

证书

所以终极问题出现了:怎么证明你爸是你爸?

我们需要一个拥有公信力的机构,例如街道办事处、公安局……等等,他们会给你开一个证明,证明你爸是你爸。

这个证明在 HTTPS 中,就叫做数字证书(Digital Certificate)。颁发这个证书的机构就叫做 Certificate Authority(证书授权中心),简称 CA。

通常 CA 都是一个国际组织,我们在浏览器输入一个网址并访问,如果域名的左边出现一个锁,点击它我们就可以看到颁布证书的机构名称和证书的到期时间等信息了。

我们也可以自己申请证书。

先提交域名信息、公司信息、联系人、公钥等等信息给第三方机构,机构审核通过后就会将证书(就是一个文件)颁发给你,其中包含颁发者、域名、公钥、有效期等等信息。这些都可以在浏览器中看到。

当然,申请证书是要交钱的,一般几千到上万不等。(也有免费的)

证书就 100% 安全了吗?

要知道,证书是一个公开的信息,如果人家把你的证书的公钥换成他自己的怎么办呢?

所以我们需要验证。

这就又用到了我们非常熟悉的哈希算法。

  1. 首先服务器用哈希算法计算公钥,生成一个 Digest(哈希值);
  2. 然后加密这个 Digest,放到证书里面,叫做“指纹”,我们也可以在别人的证书里查到这个;
  3. 客户端拿到证书之后,我们就可以在客户端计算公钥的摘要,然后解密指纹,对比这两个 Digest,我们不就能知道公钥是否被篡改了。

加密和加签

但这里又双叒叕出现了一个问题:怎么加密解密 Digest?感觉开始套娃了呀!

所以,又需要 CA 出马了。

CA 是使用自己的私钥加密 Digest,然后在客户端用 CA 的公钥解密。这就解决了问题。

但是为什么这里需要私钥加密,公钥解密呢?

我们一直使用的都是公钥加密,私钥解密呀。

这是两种不同的说法:

  • 公钥加密/私钥解密
  • 私钥加签/公钥解签

他们的作用是不一样的。

加密,是保证只有私钥持有者可以读取消息,保证消息的私密性;加签,是保证只有私钥的持有人才能发出消息,保证身份不可伪造

套娃

此时我们正在逃避一个问题。

引入 CA 的关键原因,就是因为公钥不可信任,需要一个公信机构,结果你现在跟我说公信机构的文件还可能被篡改,还需要他的公钥来保证不被篡改。

那这个公钥怎么办?谁来公信?就算有人证明了,又怎么保证这个证明的合法性?

其实早就有些东西安装在了操作系统中——那就是根证书,根证书是为了证明证书的合法性而存在的。

所以,安装根证书是一件非常危险的事情,大家千万不要随便安装根证书。

SSL/TLS

以上我们说了这么多,其实就可以总结为一种协议,这正是 SSL 协议(Secure Socket Layer)。

在 SSL3.0 的基础上,网景公司又设计了 TLS 协议(Transport Layer Security)

HTTPS = HTTP + SSL/TLS

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/xhyccc/p/14956492.html