一文看懂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为什么安全。
非常感谢您的阅读,文中如有不对的地方,欢迎指正交流!
最新文章
- unity3D-iOS工程整合爬过的坑~
- [开源]用MQL4实现MD5加密
- javascript的地基
- Iphone [Tab Bar实现多view切换,Picker,DataPicter实现
- android上传文件到wamp服务器
- 快排算法(C++版)
- struct的成员对齐问题-结构体实际大小问题
- 有趣的动画视图集合:Android View Animations
- php 之 post json 数据
- 判断一个js对象,是否具有某个属性
- 基于ZooKeeper的Dubbo简单抽样登记中心
- Linux 开启echo等服务
- 初探机器学习之使用百度AI服务实现图片识别与相似图片
- 转 spring注解式参数校验
- verilog-testbench 时钟和复位模板
- oracle随机数(转)
- js----jquery和js的区别
- 什么是wsgi,uwsgi,uWSGI
- 基于Eclipse搭建hadoop开发环境
- 【游记】CCHO TY国初划水记
热门文章
- js深度复制三种方法
- Dora.Interception,为.NET Core度身打造的AOP框架 [3]:多样化拦截器应用方式
- Java笔试题:给定一个ReadOnlyClass的对象roc,能否把这个对象的age值改成30?
- [Swift]LeetCode503. 下一个更大元素 II | Next Greater Element II
- js 里面的键盘事件对应的键码
- 开启SSH
- Java高级特性-String、StringBuffer和StringBuilder
- mysql tablespace(独立表空间)超速备份大数据
- 【Storm篇】--Storm分组策略
- BBS论坛(二十九)