一文看懂HTTPS的核心知识
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三次握手成功的基础上进行的

- 客户端发送 Client Hello 报文开始 SSL 通信。报文中包含客户端支持的 SSL 的指定版本、加密组件列表(所使用的加密算法及密钥长度)。
- 如果服务器支持 SSL 通信,会以 Server Hello 报文作为应答。和客户端一样,在报文中包含 SSL 以及加密组件。服务器的加密组件内容是从接受到的客户端加密组件内筛选出来的。
- 之后服务器发送 Certificate 报文。该报文中包含公开密钥证书。(客户端拿到公开密钥证书之后通过数字签名验证证书的真实性)
- 最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL 握手协商部分结束。
- SSL 第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。报文中包含了接下来会使用到的共享密钥。该报文已用步骤3的公开密钥进行加密。(服务器收到之后通过私有密钥解密,得到共享密钥)
- 接着客户端发送 Change Cipher Spec 报文,该报文提示服务器,在此报文之后的通信会采用共享密钥加密。
- 客户端发送 Finished 报文。该报文会生成一个消息认证码附加到该消息中。如果服务器能正确解密该报文,并且验证了MAC,那么到目前为止协商过程都是成功的,此时服务器信任了客户端。
- 服务器同样发送 Change Cipher Spec 报文,通知客户端,在此报文之后的通信会采用共享密钥加密。
- 服务器同样发送 Finished 报文。该报文也会生成一个消息认证码附加到该消息中。如果客户端能正确解密该报文,并且了验证MAC,那么建立加密信道成功,接下来就开始发送应用数据。
4、总结
HTTPS的核心就是TLS,HTTPS的安全性都是TLS提供的。所以弄明白了TLS协商的过程,你就明白了HTTPS为什么安全。
非常感谢您的阅读,文中如有不对的地方,欢迎指正交流!
一文看懂HTTPS的核心知识的更多相关文章
- 一文看懂https如何保证数据传输的安全性的【转载、收藏】
一文看懂https如何保证数据传输的安全性的 一文看懂https如何保证数据传输的安全性的 大家都知道,在客户端与服务器数据传输的过程中,http协议的传输是不安全的,也就是一般情况下http是明 ...
- 一文看懂https如何保证数据传输的安全性的
通过漫画的形式由浅入深带你读懂htts是如何保证一台主机把数据安全发给另一台主机的 对称加密 一禅:在每次发送真实数据之前,服务器先生成一把密钥,然后先把密钥传输给客户端.之后服务器给客户端发送真实数 ...
- 一文看懂HTTPS、证书机构(CA)、证书、数字签名、私钥、公钥(转)
说到https,我们就不得不说tls/ssl,那说到tls/ssl,我们就不得不说证书机构(CA).证书.数字签名.私钥.公钥.对称加密.非对称加密.这些到底有什么用呢,正所谓存在即合理,这篇文章我就 ...
- 一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系
我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是Web服务器/Web容器/Web应用程序服务器/反向代理有点像四胞胎,在网络上经常一起出现.本文将带读者对这四个相似概念如何区分. 1 ...
- [转帖]一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系
一文看懂web服务器.应用服务器.web容器.反向代理服务器区别与联系 https://www.cnblogs.com/vipyoumay/p/7455431.html 我们知道,不同肤色的人外貌差别 ...
- 【转帖】一文看懂docker容器技术架构及其中的各个模块
一文看懂docker容器技术架构及其中的各个模块 原创 波波说运维 2019-09-29 00:01:00 https://www.toutiao.com/a6740234030798602763/ ...
- 一文看懂java io系统 (转)
出处: 一文看懂java io系统 学习java IO系统,重点是学会IO模型,了解了各种IO模型之后就可以更好的理解java IO Java IO 是一套Java用来读写数据(输入和输出)的A ...
- 一文看懂Stacking!(含Python代码)
一文看懂Stacking!(含Python代码) https://mp.weixin.qq.com/s/faQNTGgBZdZyyZscdhjwUQ
- Nature 为引,一文看懂个体化肿瘤疫苗前世今生
进入2017年,当红辣子鸡PD-1疗法,一路横扫多个适应症.而CAR-T治疗的“小车”在获得FDA专委会推荐后也已经走上高速路,成为免疫治疗又一里程碑事件.PD-1.CAR-T之后,下一个免疫治疗产品 ...
随机推荐
- 【RL-TCPnet网络教程】第15章 RL-TCPnet之创建多个TCP连接
第15章 RL-TCPnet之创建多个TCP连接 本章节为大家讲解RL-TCPnet的TCP多客户端实现,因为多客户端在实际项目中用到的地方还挺多,所以我们也专门开启一个章节做讲解.另外,学习 ...
- [Swift]LeetCode132. 分割回文串 II | Palindrome Partitioning II
Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...
- [Swift]LeetCode271. 加码解码字符串 $ Encode and Decode Strings
Design an algorithm to encode a list of strings to a string. The encoded string is then sent over th ...
- [Swift]LeetCode560. 和为K的子数组 | Subarray Sum Equals K
Given an array of integers and an integer k, you need to find the total number of continuous subarra ...
- [Swift]LeetCode798. 得分最高的最小轮调 | Smallest Rotation with Highest Score
Given an array A, we may rotate it by a non-negative integer K so that the array becomes A[K], A[K+1 ...
- [Swift]LeetCode959. 由斜杠划分区域 | Regions Cut By Slashes
In a N x N grid composed of 1 x 1 squares, each 1 x 1 square consists of a /, \, or blank space. Th ...
- CentOS安装gcc clang git mysql等软件高版本福利
最近同事需要在单位提供的开发机上临时安装gcc等软件,时间紧迫,因此向其推荐安装福利devtoolset. 感谢devtoolset,使得CentOS软件安装无比的快捷,卸载也是无与伦比的简单. gc ...
- java代码之美(2)---Java8 Stream
Stream 第一次看到Stream表达式就深深把我吸引,用它可以使你的代码更加整洁而且对集合的操作效率也会大大提高,如果你还没有用到java8的Stream特性,那就说明你确实out啦. 一.概述 ...
- 『NOIP2018普及组题解』
标题统计 题目描述 凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符? 注意:标题中可能包含大.小写英文字母.数字字符.空格和换行符.统计标题字 符数时,空格和换行符不计算在内. 输入格式 ...
- SpringBoot入门教程(九)定时任务Schedule
在日常项目运行中,我们总会有需求在某一时间段周期性的执行某个动作.比如每天在某个时间段导出报表,或者每隔多久统计一次现在在线的用户量.在springboot中可以有很多方案去帮我们完成定时器的工作,有 ...