聊聊 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. 学习Keepalived(一)

    一.Keepalived 详解 1.Keepalived 定义 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障.一个LVS服务会有2台服务器运行Ke ...

  2. 《每周一点canvas动画》——圆周运动

    接<每周一点canvas动画>--波形运动 圆周运动可以分为两种基本的形式:正圆运动和椭圆运动.在讲解圆周运动之前,必不可少的数学公式即将袭来.so,各位骚年们,请护好自己的膝盖.听不懂没 ...

  3. SQL之总结(一)

    导游通项目之总结SQL 1.选择前面的某几个 oracle:  select * from tb_article where rownum<5 order by article_id       ...

  4. java的原子类到底是啥?ABA,CAS又是些什么?

    1)解决并发不是用锁就能解决吗,那SDK干嘛还要搞个原子类出来? 锁虽然能解决,但是加锁解锁始终还是对性能是有影响的,并且使用不当可能会造成死锁之类的问题. 2)原子类是怎样使用的,比如说我要实现一个 ...

  5. Linux 0.11源码阅读笔记-块设备驱动程序

    块设备驱动程序 块设备驱动程序负责实现对块设备数据的读写功能.内核代码统一使用缓冲块间接和块设备(如磁盘)交换数据,缓冲区数据通过块设备驱动程序和块设备交换数据. 块设备的管理 块设备表 内核通过一张 ...

  6. Python疫情爬取输出到txt文件

    在网上搬了一个代码,现在不适用了,改了改 import requestsimport jsondef Down_data(): url = 'https://view.inews.qq.com/g2/ ...

  7. PAT1018 锤子剪刀布

    大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入 ...

  8. Spring 和 SpringMVC 常用注解和配置(@Autowired、@Resource、@Component、@Repository、@Service、@Controller的区别)

    Spring 常用注解 总结内容 一.Spring部分 1.声明bean的注解 2.注入bean的注解 3.java配置类相关注解 4.切面(AOP)相关注解 5.事务注解 6.@Bean的属性支持 ...

  9. java集合(arraylist详解)

    一.ArrayList概述 ArrayList是实现List接口的动态数组,所谓动态就是它的大小是可变的.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类 ...

  10. nodejs创建服务器

      'use strict'; //加载http模块: const http = require('http'); //创建一个http服务: const server = http.createSe ...