聊聊 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的更多相关文章

  1. 也来聊聊 HTTPS.

    前言: 网上聊 HTTPS 的文章已经数都数不过来了吧,厚着脸皮,整理下读书笔记,结合平常项目的实践,也来聊聊 HTTPS. 一.为什么需要 HTTPS? 众所周知,HTTP 协议具有无连接.不可靠. ...

  2. 聊聊HTTPS和SSL/TLS协议

    要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识.1. 大致了解几个基本术语(HTTPS.SSL.TLS)的含义2. 大致了解 HTTP 和 TCP 的关系(尤其是“短连接”VS“长连接 ...

  3. 聊聊HTTPS和SSL_TLS协议

    要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识. 1. 大致了解几个基本术语(HTTPS.SSL.TLS)的含义 2. 大致了解 HTTP 和 TCP 的关系(尤其是“短连接”VS“长 ...

  4. 聊聊HTTPS和SSL/TLS协议 分类: 计算机网络 2015-07-11 21:41 4人阅读 评论(0) 收藏

    要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识. 1. 大致了解几个基本术语(HTTPS.SSL.TLS)的含义 2. 大致了解 HTTP 和 TCP 的关系(尤其是"短连接 ...

  5. 【转】聊聊HTTPS和SSL/TLS协议

    要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识.1. 大致了解几个基本术语(HTTPS.SSL.TLS)的含义2. 大致了解 HTTP 和 TCP 的关系(尤其是“短连接”VS“长连接 ...

  6. 从让 HTTPS 更安全出发,聊聊 HTTPS

    随着公众对网络安全的日益关注,各种网络安全防护手段层出不穷.HTTPS Everywhere作为提升HTTPS安全性的有效手段,日前安全性与实用性再次得到了加强. HTTPS虽然可以有效提升用户浏览网 ...

  7. 聊聊HTTPS和SSL/TLS协议 【基础入门】

    要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识.1. 大致了解几个基本术语(HTTPS.SSL.TLS)的含义2. 大致了解 HTTP 和 TCP 的关系(尤其是“短连接”VS“长连接 ...

  8. 聊聊HTTPS和SSL协议

    本文为转载,原文链接http://www.techug.com/https-ssl-tls,作者不详. 要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识. 1. 大致了解几个基本术语(H ...

  9. 浅谈HTTPS安全性

    各位可曾有过使用智能手机App在网络商店购物的经验,想必是有的,那你/妳会不会担心不够安全呢?有人会说放心吧,购物网站有使用SSL/TLS加密传输,我们就来聊聊HTTPS好了. 客户端与服务器端的交握 ...

随机推荐

  1. 2.安装Spark与Python练习

    一.安装Spark <Spark2.4.0入门:Spark的安装和使用> 博客地址:http://dblab.xmu.edu.cn/blog/1307-2/ 1.1 基础环境 1.1.1 ...

  2. springboot项目如何添加热部署

    环境jdk1.8.maven3.6.使用工具为idea 1.在pom.xml文件中添加依赖 <dependency> <groupId>org.springframework. ...

  3. C++函数声明的时候后面加const

    非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改该类中成员的操作都是不允许的(因为隐含了 ...

  4. Visual Studio Code 快捷键大全(最全)

    Visual Studio Code 是一款优秀的编辑器,对于开发前端带来了很多便利,熟悉快捷键的使用,能够起到事半功倍的作用,提高工作效率.下面就Visual Studio Code常用快捷键的一些 ...

  5. C++ | 简单工厂模式 | 复数计算器

    简单工厂模式最直观的一个应用便是实现一个计算器的程序. 比如,公司让你给计算器添加一个幂运算的功能,你只需要设计一个幂运算的类,并实现幂运算的逻辑,然后让该类继承自运算类即可. 简单工厂模式: 简单工 ...

  6. C++重载输入流、输出流运算符

    在c++中类的私有成员是不能被直接访问的,需要通过类中提供的成员函数简介的操作这些数据.同时C++ 能够使用流提取运算符 >> 和流插入运算符 << 来输入和输出内置的数据类型 ...

  7. 【译】感谢 Flash 所做的一切

    翻译:疯狂的技术宅来源:Chromium Blog原文标题:So long, and thanks for all the Flash英文原文:https://blog.chromium.org/20 ...

  8. 百度图像识别SDK实验

    软件构造实验作业 实验名称:百度图像识别SDK实验 班级:信1905-1      学号:20194171      姓名:常金悦          一. 实验要求 每个步骤必须截图并说明 二.实验步 ...

  9. 【Android开发】【布局】几个常用布局构成的简单demo

    图image1.jpg,就是常用的 底部菜单栏 + Fragment联动 使用 RadioGroup + Fragment 图image2.jpg ,就是 TabLayout + ViewPager ...

  10. java中自动插入一个默认的构造函数,这到底怎么回事?

    1.2 当没有任何构造函数,java编译器,会插入一个默认的构造函数    见下面的例子: class Line {     double x = 0.02;     double y; } publ ...