一文看懂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之后,下一个免疫治疗产品 ...
随机推荐
- request.getRequestDispatcher跳转jsp页面失败
我在JS里面写了个Ajax,传值给控制器,然后利用request.getRequestDispatcher(),打算跳转至另外一个页面.但是没有跳转成功,运行之后没反应. 在网上搜了资料发现,利用aj ...
- LeetCode编程训练 - 合并查找(Union Find)
Union Find算法基础 Union Find算法用于处理集合的合并和查询问题,其定义了两个用于并查集的操作: Find: 确定元素属于哪一个子集,或判断两个元素是否属于同一子集 Union: 将 ...
- [Swift]LeetCode685. 冗余连接 II | Redundant Connection II
In this problem, a rooted tree is a directed graph such that, there is exactly one node (the root) f ...
- 使用Task
http://www.cnblogs.com/Charltsing/p/taskpoolthread.html task默认对线程的调度是逐步增加的,连续多次运行并发线程,会提高占用的线程数,而等若干 ...
- Qt中OpenGL模块下将图片转化为纹理,并传入shader中
QImage texture, buffer; buffer.load("C:/Users/wukesong/Pictures/flower.jpg"); texture = QG ...
- c 编译器大全
c 编译器大全 看了下nginx的auto/cc下的目录,nginx对多种c语言的编辑器都进行了支持.才知道c语言有那么多编辑器. 编译器原理 所谓编译器,就是执行下面的三步骤: 1 将目标语言转换为 ...
- 【Docker】(5)---springCloud注册中心打包Docker镜像
[Docker](5)---springCloud注册中心打包Docker镜像 上一篇文章讲了将镜像推送到远处私有仓库,然后再从私有仓库拉取该镜像的过程.而这里的镜像是直接从Docker拉取的. 所以 ...
- directshow、 Emgucv入门
本示例主要测试了directshow.Emgucv的视频流采集功能,其中Emgucv还实现了人脸的识别.示例源码下载 一.directshow的介绍 实现原理:directshow可以将摄像头的数据流 ...
- tomcat的catalina.out日志按自定义时间日式进行分割
使用cronolog对tomcat的日志进行自定义日期格式的切割,方便日志的整理和遇到问题日志的排查! 1.安装cronolog工具1.1 下载 cronolog 地址:网上很多下载地址这里就不在累赘 ...
- Linux命令之sftp - 安全文件传输命令行工具
用途说明 sftp命令可以通过ssh来上传和下载文件,是常用的文件传输工具,它的使用方式与ftp类似,但它使用ssh作为底层传输协议,所以安全性比ftp要好得多. 常用方式 格式:sftp <h ...