聊聊 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. 什么是基于 Java 的 Spring 注解配置? 给一些注解的例子?

    基于 Java 的配置,允许你在少量的 Java 注解的帮助下,进行你的大部分 Spring 配置而非通过 XML 文件. 以@Configuration 注解为例,它用来标记类可以当做一个 bean ...

  2. npm run start 后台运行

    yum provides */nohup nohup npm start & 原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用. 停止程序   ps -ef ...

  3. Effective Java —— 覆盖equals时遵守通用约定

    本文参考 本篇文章参考自<Effective Java>第三版第十条"Obey the general contract when overriding equals" ...

  4. 显示调用C++中构造函数和析构函数(有什么弊端)

    1.C++中, 构造函数和析构函数可以被显示调用. 显示调用默认构造函数的语法: a.A::A();(不能写成a.A();) , 显示调用非默认构造函数的语法: a.A::A(7);(不能写成a.A( ...

  5. 三、原理图生成网表并导入PCB放置元件

    1.生成网表 2.成功标志 3.新建PCB文件 4.导入网表至PCB 5.导入网表成功标志 6.创建.psm文件(绘制的封装格式为.dra文件,在PCB里面要以.psm的文件存在)  将丝印做成封装需 ...

  6. C#编写程序,计算数组中奇数之和和偶数之和

    编写程序,计算数组中奇数之和和偶数之和. 代码: using System; using System.Collections.Generic; using System.Linq; using Sy ...

  7. javaScript设计模式:发布订阅模式

    发布订阅模式的思想是在观察者模式的基础上演变而来,在观察者模式中客户端监听到对象某个行为就触发对应任务程序.而在发布订阅模式中依然基于这个核心思想,所以有时候也会将两者认为是同一种设计模式.它们的不同 ...

  8. 拼写检查-c++

    [问题描述] 作为一个新的拼写检查程序开发团队的成员,您将编写一个模块,用已知的所有形式正确的词典来检查给定单词的正确性.        如果字典中没有这个词,那么可以用下列操作中的一个来替换正确的单 ...

  9. FastAPI(七十二)实战开发《在线课程学习系统》接口开发-- 留言列表开发

    之前我们分享了FastAPI(七十一)实战开发<在线课程学习系统>接口开发-- 查看留言,这次我们分享留言列表开发. 列表获取,也需要登录,根据登录用户来获取对应的留言.逻辑梳理如下. 1 ...

  10. 在Wireshark中使用过滤器——显示过滤器

    在Wireshark运行过程中选择搜索(Ctrl-F),第一个默认的搜索选项就是显示过滤器. 显示过滤器用于捕获文件,用来告诉Wireshark只显示那些符合过滤条件的数据包. 显示过滤器比捕获过滤器 ...