前言🍊
在日常生活中我们经常会看见HTTP,但是随着HTTP的大量使用也带来了很多安全隐患。于是HTTPS应运而生,我们又开始看到SSL/TLS,这部分前端同学们一般比较少会去了解,趁最近在折腾这方面来给大家一起分享和科普一下吧!
背景🍊
HTTP和HTTPS之间的区别
在讲 HTTPS之前,我们先来看看HTTP有哪些不足:
- 使用明文通信,内容可能会被窃听,并且随意篡改
- 不验证通信双方身份,有可能遭遇伪装
- 无法证明报文的完整性,内容可能遭到篡改
为了解决这些不足,HTTPS 多了以下特性:
TLS/SSL内容加密数字证书(CA)验明身份: 防范中间人攻击MD5、SHA-1等散列值方法防止信息篡改
HTTPS 相对于 HTTP 性能上差点,因为多了 SSL/TLS 的几次握手和加密解密的运算处理,但是加密解密的运算处理已经可以通过特有的硬件来加速处理。
SSL/TLS 是什么?
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。
为了保护敏感数据在传送过程中的安全,全球许多知名企业采用SSL加密机制,也随着数据安全的重要性和趋势,越来越多的网站都开始接入HTTPS。
SSL协议提供的安全通道有以下三个特性:
- 机密性:SSL协议使用密钥加密通信数据。
- 可靠性:服务器和客户都会被认证,客户的认证是可选的。
- 完整性:SSL协议会对传送的数据进行完整性检查。
简单地讲,SSL/TLS就是同时结合各种密码算法、数字签名算法及数字证书等技术的一套协议,目的就是为了保证通信的安全性。
采用SSL/TLS协议,通信双方建立连接之前需要进行握手,目的是协商出会话密钥,用于后续对通信数据的加解密操作。
加密算法分为两大类:
- 对称加密算法
数据加解密使用同一份密钥,加解密速度快,效率高,缺点是密钥的管理难度大,一旦密钥传输泄露,那就没啥用处了。
- 非对称加密算法
数据加解密使用公钥和私钥,公钥用于传输,私钥自己保存,安全性较高,但加解密速度偏慢。
公钥和私钥的概念
私钥(放在服务器上,用于公钥加密过的数据),不会放在互联网上传输; 公钥(放在互联网上,所有人都能拿到的一串加密的字符串,这个加密的字符串是来加密我们的字符信息的。当加密的数据传到服务器上,只有服务器通过私钥解密,才能把公钥加密的数据拿出来)
公钥和私钥主要是用在握手的时候进行一个传输,然后握手的时候,公钥和私钥传输的内容,实际上是真正传输的过程中加密的字符串。
客户端和服务端就可以通过这个加密的字符串进行安全的数据传输,后期就通过主秘钥来进行客户端和服务端的数据传输,所以中间的加密数据传输就是安全的数据传输
另外,要想根据密文和公开密钥,恢复到信息原文是异常困难。
SSL证书
SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。
SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。
正文🍊
图解SSL/TLS
在正式分析之前,先引入阮一峰老师的图解SSL/TLS协议帮大家快速理解下基础概念,这边john将对话内容翻译成中文:
握手阶段分成五步:
- 第一步,爱丽丝给出协议版本号、一个客户端生成的随机数(
Client random), 以及客户端支持的加密方法。 - 第二步,鲍勃确认双方使用的加密方法,并给出
数字证书、以及一个服务器生成的随机数 (Server random)。 - 第三步,爱丽丝确认数字证书有效,然后生成一个新的随机数(
Premaster secret), 并使用数字证书中的公钥,加密这个随机数,发给鲍勃。 - 第四步,鲍勃使用自己的私钥,获取爱丽丝发来的随机数(即
Premaster secret)。 - 第五步,爱丽丝和鲍勃根据约定的加密方法,使用前面的三个随机数,生成"对话密钥"
(
session key),用来加密接下来的整个对话过程。
综合分析
这里是https握手的一个过程对阮一峰老师图解的一个展开,总共5个步骤,这里文字较多,可以看图一起消化,或者直接跳过看后面的wireShark分析后再回头理解下:
- 客户端生成一个
随机数,然后传输到服务端,并且会带上客户端这边支持的所有加密套件 - 服务端拿到这个随机数之后先存着,服务端也生成一个随机数,这个随机数会伴随着服务端的
证书,也就是我们之前说到的公钥,一起传输给客户端 - 客户端拿到了服务端的随机数之后也先存着,通过服务端传给他的公钥生成一个
预主秘钥,生成过程当中会产生一个新的随机数,所以总共是有三个随机数,客户端生成的这个随机数用公钥加密后传输给服务器这边,这个过程就是没有办法被中间人解析的一个过程,因为它使用的是公钥进行加密,只有服务端这边的私钥可以对其解密 - 这个数据传输到服务器之后,服务器通过私钥解密,拿到了预主秘钥也就是我们说的那个随机字符串
- 最终服务端会选择一个客户端这边支持的加密套件,然后两边确定同时使用这同一个加密套件,对这三个随机数进行一个
算法的操作,生成一个主秘钥,因为最后一个随机数只有客户端和服务端知道,中间人根本拿不到,所以他们生成的这个主秘钥也是中间人根本没有办法破解的,后期传输的数据就全部是通过这个主秘钥进行加密的,因为两边主秘钥是一样的,所以两边都能够对数据加密之后进行解密,中间人因为没有办法知道这个主秘钥,所以他没有办法对数据进行解密,所以这中间的数据传输就变成了安全的传输
简单描述下:1、客户端发送随机数和支持的加密套件; 2、服务端发送一个随机数和证书(公钥),并且选择其中一个他认为最合理的加密套件返回 3、客户端再生成一个随机数用公钥加密生成预主秘钥发送给服务端 4、服务端使用私钥解密预主秘钥 4、两边同时使用确认过的加密套件,对这三个随机数进行一个算法的操作,生成一个主秘钥来进行数据进行加解密传输
下面使用Wireshark抓包工具简单分析下HTTPS协议的握手过程配合消化,以访问百度为栗:
- 客户端向服务器端发送一个
Client Hello
其中
random是生成的随机数,cipher Suites就是客户端这边支持的所有的加密套件,然后服务端就会选择其中一种,他认为最好的返回给客户端,最终他们生成主秘钥的过程当中就会用到这个加密套件
- 服务器端向客户端返回一个
Server Hello
这里服务端也会发送一个
random随机数,他会选择其中一个cipher Suites,也就是刚才列出来的10多种里面的其中一种服务端认为最合理的返回
- 服务器端向客户端返回一个
Certificate
服务端还会继续发送一个返回,这个返回中服务端向客户端下发一份证书,也就是我们之前说到公钥,一起传输给客户端
- 客户端向服务器端发送
Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
客户端拿到这个证书之后,他就去发送最后一次加密的随机数,我们可以看到Encrypted Handshake Message这个数据是显示不出来的,它是加密过的数据(预主秘钥),然后服务端拿到这个数据之后,要通过私钥解密才能拿到真正有用的东西
总结:这就是https的握手过程,最后一条数据是加密的以此来保证整个传输的部分的内容是安全传输的,这样中间人拿不到,最后生成的密钥是两边知道但是中间人完全无法拿到和解析的,通过这种方式来保证最后的数据传输是真正的安全
按照流程:双方交换
random1和random2客户端生成random3作为pre master secret,并通过被签名的可靠公钥加密后传给 server, 这样双方都拿random1 random2 random3通过算法各自生成master secret在这里,只有random3是能够保证不被第三人知道的,为什么公开的random1和 random2有存在的必要?为什么不直接生成master secret发过去? 查了查资料,这里是因为前向安全性。加入随机参数,使得:即使现在所有密钥都泄露了, 历史消息也不会被破解。 参考链接:如何理解前向安全性?和完美前向保密(perfect forward secrecy)区别?
参考资料: