一文看懂HTTPS的核心知识

时间:2022-01-03 15:04:50

1、HTTPS历史

  由于HTTP的消息传输的安全隐患,于是网景公司在1994年设计了SSL(Secure Sockets Layer,安全套接字层)协议,目的是保障网上交易安全,从而就诞生了HTTPS。有了SSL之后,HTTP在和TCP通信之前,先和SSL通信,SSL 会对 HTTP 的报文进行加密,再由SSL和TCP通信。最初,HTTPS 是与 SSL 一起使用的,鉴于SSL协议是网景公司专有的,IETF(The Internet Engineering Task Force,国际互联网工程任务组)成立了一个小组负责标准化该协议,后来就有了RFC 2246,即TLS 1.0(Transport Layer Security,传输层安全),现在最新版本已经到了TLS 1.3。TLS 或 SSL 协议不仅可以服务于 HTTP 协议,还可以为电子邮件、即时通讯提供安全服务。

2、TLS协议

  TLS协议的目标是为在它只是运行的应用提供三个基本服务:加密、身份验证和数据完整性。正是这三项基本服务保证了HTTP通信的安全。

2.1、加密(混淆数据的机制)

  TLS用到了两种加密算法,分别是共享密钥加密和公开密钥加密,

  • 共享密钥加密(也叫对称密钥加密):加密和解密都用同一个密钥的加密方式。加密算法处理速度比公开密钥快。
  • 公开密钥加密(也叫非对称密钥加密):这种加密方式有两把密钥,一把私有密钥,一把公开密钥。通过公开密钥加密,然后通过私有密钥解密。公开密钥可以告诉任何人,但私有密钥只有自己才知道。

  它们是怎么进行加密解密的呢?我们先来试试第一种加密方式,客户端通过密钥加密,然后把密钥和加密后的数据一起发给服务器,然后服务器解密。聪明人一眼就可以看出来这种方式行不通,因为无法保证密钥能够安全到达服务器,所以这种办法行不通。

  第二种方式很好的解决了共享密钥加密的困难。客户端通过服务器的公开密钥加密,然后把加密后的数据发送给服务器,服务器再通过自己的私有密钥解密。私有密钥只有一份,就算窃听者拿到数据,也无法解密。但是这种方式也有缺陷,公开密钥加密的算法太复杂了,需要运行太多的时间。

  最终TLS采用了共享密钥加密和公开密钥加密两者并用的混合加密机制,服务器把自己的公开密钥传送给客户端,客户端接收到公开密钥,然后创建一个共享密钥,用公开密钥给共享密钥加密,然后把加密后的共享密钥发送给服务器,服务器通过私有秘钥进行解密,获得共享密钥,双方都有了同一个共享密钥之后,就通过共享密钥来加密解密报文。

2.2、身份验证(验证身份标识有效性的机制)

  上面介绍的混合加密机制看上去很理想,遗憾的是,依然存在一个问题没解决,那就是无法证明客户端接收到的公开密钥是货真价实的。介绍解决办法之前,先介绍一下CA(Certificate Authority,数字证书认证机构):

数字证书认证机构,也称为电子商务认证中心、电子商务认证授权机构,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。

  申请者通过CA申请数字证书,CA验证申请人的身份,然后发放数字证书。证书中绑定了公钥数据和私钥拥有者的身份信息,并带有CA的数字签名,证书中也包含了CA的名称。

  那么在客户端与服务器通信的时候,服务器将证书发送给客户端,客户端在拿到这个证书之后怎么判断证书的真伪呢?这才是身份验证的关键所在。客户端读取证书中CA的名称,因为浏览器会内置常用CA的公开密钥,然后通过CA的名称查询它的公钥,验证证书上面的数字签名是否正确。此处的公钥并不是客户端与服务器通信加密用的公钥,而是CA公布出来的公钥,用来验证证书的数字签名。验证通过了,就能判断证书的真实性,也就可以相信证书里的公开密钥是可以信任的。

2.3、数据完整性(检测消息是否被篡改或伪造的机制)

  除了混合密钥加密和身份验证,TLS协议还提供了自己的消息分帧机制,使用MAC(Message Authentication Code,消息认证码)签署每一条消息。MAC算法是一个单向加密的过程,密钥由连接双方协商确定(这里用的就是共享密钥)。只要发送TLS消息,就会生成一个MAC值附加到该消息中。接收端通过共享密钥计算和验证这个MAC值来判断消息的完整性和可靠性。

  上述三种机制是TLS协议的核心,它们为Web通信构建了一个安全的环境。了解完这三种机制之后,咱们来看一下它们具体是怎么协作的,也就是TLS握手的过程。

3、TLS握手

  客户端与服务器在通过TLS交换数据之前,必须协商建立加密信道,协商的过程叫做TLS握手,也叫TLS协商。下图的握手过程是在TCP三次握手成功的基础上进行的

   一文看懂HTTPS的核心知识

  1. 客户端发送 Client Hello 报文开始 SSL 通信。报文中包含客户端支持的 SSL 的指定版本、加密组件列表(所使用的加密算法及密钥长度)。
  2. 如果服务器支持 SSL 通信,会以 Server Hello 报文作为应答。和客户端一样,在报文中包含 SSL 以及加密组件。服务器的加密组件内容是从接受到的客户端加密组件内筛选出来的。
  3. 之后服务器发送 Certificate 报文。该报文中包含公开密钥证书。(客户端拿到公开密钥证书之后通过数字签名验证证书的真实性)
  4. 最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL 握手协商部分结束。
  5. SSL 第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。报文中包含了接下来会使用到的共享密钥。该报文已用步骤3的公开密钥进行加密。(服务器收到之后通过私有密钥解密,得到共享密钥)
  6. 接着客户端发送 Change Cipher Spec 报文,该报文提示服务器,在此报文之后的通信会采用共享密钥加密。
  7. 客户端发送 Finished 报文。该报文会生成一个消息认证码附加到该消息中。如果服务器能正确解密该报文,并且验证了MAC,那么到目前为止协商过程都是成功的,此时服务器信任了客户端。
  8. 服务器同样发送 Change Cipher Spec 报文,通知客户端,在此报文之后的通信会采用共享密钥加密。
  9. 服务器同样发送 Finished 报文。该报文也会生成一个消息认证码附加到该消息中。如果客户端能正确解密该报文,并且了验证MAC,那么建立加密信道成功,接下来就开始发送应用数据。

4、总结

  HTTPS的核心就是TLS,HTTPS的安全性都是TLS提供的。所以弄明白了TLS协商的过程,你就明白了HTTPS为什么安全。

  

  非常感谢您的阅读,文中如有不对的地方,欢迎指正交流!   

一文看懂HTTPS的核心知识的更多相关文章

  1. 一文看懂https如何保证数据传输的安全性的【转载、收藏】

    一文看懂https如何保证数据传输的安全性的   一文看懂https如何保证数据传输的安全性的 大家都知道,在客户端与服务器数据传输的过程中,http协议的传输是不安全的,也就是一般情况下http是明 ...

  2. 一文看懂https如何保证数据传输的安全性的

    通过漫画的形式由浅入深带你读懂htts是如何保证一台主机把数据安全发给另一台主机的 对称加密 一禅:在每次发送真实数据之前,服务器先生成一把密钥,然后先把密钥传输给客户端.之后服务器给客户端发送真实数 ...

  3. 一文看懂HTTPS、证书机构(CA)、证书、数字签名、私钥、公钥(转)

    说到https,我们就不得不说tls/ssl,那说到tls/ssl,我们就不得不说证书机构(CA).证书.数字签名.私钥.公钥.对称加密.非对称加密.这些到底有什么用呢,正所谓存在即合理,这篇文章我就 ...

  4. 一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系

    我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是Web服务器/Web容器/Web应用程序服务器/反向代理有点像四胞胎,在网络上经常一起出现.本文将带读者对这四个相似概念如何区分. 1 ...

  5. [转帖]一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系

    一文看懂web服务器.应用服务器.web容器.反向代理服务器区别与联系 https://www.cnblogs.com/vipyoumay/p/7455431.html 我们知道,不同肤色的人外貌差别 ...

  6. 【转帖】一文看懂docker容器技术架构及其中的各个模块

    一文看懂docker容器技术架构及其中的各个模块 原创 波波说运维 2019-09-29 00:01:00 https://www.toutiao.com/a6740234030798602763/ ...

  7. 一文看懂java io系统 (转)

    出处:  一文看懂java io系统   学习java IO系统,重点是学会IO模型,了解了各种IO模型之后就可以更好的理解java IO Java IO 是一套Java用来读写数据(输入和输出)的A ...

  8. 一文看懂Stacking!(含Python代码)

    一文看懂Stacking!(含Python代码) https://mp.weixin.qq.com/s/faQNTGgBZdZyyZscdhjwUQ

  9. Nature 为引,一文看懂个体化肿瘤疫苗前世今生

    进入2017年,当红辣子鸡PD-1疗法,一路横扫多个适应症.而CAR-T治疗的“小车”在获得FDA专委会推荐后也已经走上高速路,成为免疫治疗又一里程碑事件.PD-1.CAR-T之后,下一个免疫治疗产品 ...

随机推荐

  1. effective OC2.0 52阅读笔记(七 系统框架)

    47 熟悉系统框架 总结:将代码封装为动态库,并提供接口的头文件,就是框架.平时的三方应用都用静态库(因为iOS应用程序不允许在其中包含动态库),并不是真正的框架,然而也经常视为框架.例如:NSLin ...

  2. Winform MDI窗体容器 权限 简单通讯

    MDI窗体容器 权限  using System; using System.Collections.Generic; using System.ComponentModel; using Syste ...

  3. OpenCv实现两幅图像的拼接

    直接贴上源码 来源:http://www.myexception.cn/image/1498389.html 实验效果 Left.jpg right.jpg ImageMatch.jpg #inclu ...

  4. TinyMCE textarea 输入框外部程序动态修改方法

    TinyMCE textarea 输入框外部程序动态修改方法 Public Function C2IE_TINYMCE(ByVal id As String, ByVal value As Strin ...

  5. 【linux】压缩和解压缩

    .gz格式 压缩gzip: gzip只能压缩文件,且压缩后文件消失,不能压缩目录. [root@andon tmp]# ls ml orbit-gdm pulse-2sLvu7UbjUYf pulse ...

  6. 【Android】源码external/目录中在编译过程中生成的文件列表

    => external/eyes-free:   accessibilityvalidator.jar (host,share) => external/mesa3d:   libMesa ...

  7. windows 8.1 administrator相关设置

    一.windows 8.1 开启administrator用户 windows8.1中文版,由于默认不开启administrator用户,所以需要自己手动开启 启用administrator:在cmd ...

  8. ZOJ2105 终于找到错误

    ZOJ2105:点击打开链接 错误代码 #include<stdio.h> #include<stdlib.h> int q[110]; int main() { int a, ...

  9. js 关于性能的数据存储

    1.JavaScript中四种基本数据存取位置:字面量,本地变量,数组元素,对象成员.(四个都是存在于内存中) 一般来说:[字面量,局部变量]运行速度>[数组,对象成员] 2.内部属性包含了一个 ...

  10. 初入python 用户输入,if,(while 循环)

    python 基础 编译型: 一次性将所有程序编译成二进制文件. 缺点:开发效率低,不能跨平台 优点:运行速度快. :c ,c++语言 等等.... 解释行:当程序执行时,一行一行的解释. 优点:开发 ...