详细了解TLS、HTTPS、SSL原理
Requests data treating Responses data 浏览器端/客户端 服务器端 MAC界面
- 客户端会以一定的方法向服务器端发送请求,例如
GET(查)、POST(增)、PUT(改)、DELETE(删)等; - 客户端发送给服务器端的信息应当包含那些信息,这些信息应当以何种格式进行传输,如
Content-Type、Content-Length、User-Agent等请求头; - 服务器端处理完请求后,返回给客户端的状态码有哪些,如
1xx、2xx等; - 规定上述传输方法、格式和标准的协议,被称为超文本协议 (Hyper Text Transfer Protocol )或HTTP。世界上所有的web服务都实现了http协议。,可以说,http协议是现代互联网发展的基石,它在整个互联网的发展中起着举足轻重的作用;
- http协议最大的不足就是所有数据都是以明文的方式进行传递的,这将对信息的隐私性和数据完整性产生重大挑战: 例如:黑客可以截获明文的http协议数据,恶意篡改后发送给接收人,进而套取更多的信息,即所谓【中间人攻击】。
- 为了解决http协议的安全问题,人们引入了新的机制,即https协议 。这里的
s即secure/安全之意。https通过加密来提高http协议的安全性;
-
在OSI 7层网络模型或TCP/IP 4层网络模型中,HTTP协议处于最上层的应用层中 :
Server Client Internet Internet Network Access Transport Application Transport Application Internet Network Access -
针对Application层http协议 ,人们引入了TLS协议 的概念作为补充。++TLS专门用于对数据进行加密和解密操作++。
-
TLS协议全称为Transport Layer Security ,即传输加密协议。是目前使用最为广泛的网络传输加密协议。与之相对应的还有SSL协议,最早由美国网景公司设计,后来贡献给IETF组织。最后的SSL3.0版本于1996年11月发布,被重命名为 TLS 1.0。这也是最早的TSL版本。目前TLS的版本已经到了TLS 1.3,原来的1.0不再推荐使用。所以,SSL约等于TLS ; 事实上,任何基于TCP/IP协议的上层协议或者应用都可以使用TLS进行加密和解密;
-
TLS协议的初步思想是对称加密,即++通讯双方根据协商好的算法生成一个唯一的密钥,该秘钥将同时对数据进行加密和解密操作++ :
Client Server 客户端所支持的TLS版本 和加密算法 Client Hello 从客户端提供的中选出最优TLS版本 和加密算法 Server Hello 接受服务器反馈 并生成一段随机字符串(预主密钥) 告诉服务器端算法等信息和预主密钥 通过加密函数+算法生成一对密钥(会话密钥) 通过加密函数+算法生成一对密钥(会话密钥) 通讯双方通过会话密钥进行加密对话 通讯双方通过会话密钥进行加密对话 Client Server对称加密最大的问题是如何保证加密函数+算法和预主密钥在传输的过程中不会被黑客攻击、窃取。
-
为了解决上述问题,TLS协议后续引入了非对称加密,即保留两种密钥:公钥 或者 私钥:
- 私钥用于解密;
- 公钥用于加密;
这种区分公私密钥的方式被称为PKI(
public key infrastructure)。
Client Server 生成公钥和私钥 将公钥传输给Server 通过公钥对要传输的数据进行加密 将加密后的数据传输给Client 通过私钥对数据进行解密 Client Server在上述过程中,即使传输被黑客所截获,但由于黑客没有对应的私钥对数据进行解密,所以无法获取到真正的内容。
- 值得注意的是,非对称加密是不可逆的,即无法使用公钥进行解密,私钥进行加密;
-
TlS协议 + 对称加密的过程如下:
Client Server 客户端有所支持的TLS版本 和加密算法 在服务器端建站之初就生成了公钥和私钥 Client Hello 从客户端提供的中选出最优TLS版本 和加密算法 Server Hello 发送服务器端的公钥 接受服务器反馈 生成一段随机字符串(预主密钥), 使用接收到的公钥对预主密钥进行加密 告诉服务器端经过加密的预主密钥 使用预留的私钥解密信息获得预主密钥 通过一定的算法将预主密钥转化成会话密钥 通过同样的算法将预主密钥转化成会话密钥 通讯双方通过会话密钥进行加密对话 通讯双方通过会话密钥进行加密对话 Client Server但是上述操作还会面临一个问题,就是在信息传输过程中传递的服务器公钥可能会被调包。此时,黑客可以让你使用他提供给你的公钥形成预主密钥。之后黑客拿着你提供的加密信息用他自己的私钥解密获得预祝密钥后和你进行对话了。你可能自始至终不以为是和服务器端对话,其实你是在和黑客对话,消息都被黑客获取了。
-
为了解决上述的这个问题,TLS协议引入了证书。在上述对话传输中,客户端获得的不再是公钥,而是服务器端的证书 :
- 证书,全称为数字证书,即
digital certification; - 其由证书颁发机构(
certificate authority)/CA所颁发; - 证书是唯一标识一个站点的身份信息;
- 证书,全称为数字证书,即
-
以下介绍证书是如何查看和申请发放的:
- 以Chrome为例,点击url栏最左侧的设置/锁头标志,再依次点击
connection is secure和certificate is valid,便会弹出网站的证书信息。 - 一个证书通常包含以下内容:
issued to:证书的申请者;issued by:证书的颁发机构,由哪个CA机构颁发的;validity period:证书的有效起始日期和结束日期;fingerprint:证书的指纹信息,用于验证证书的合法性;
- CA是全球性的权威证书签发机构,分布于各个国家中。常见的CA机构有:
- digicert;
- Let's Encrypt (
免费的); - globalSign;
- Entrust;
- 当我们想为网站开启HTTPS服务时,就需要向CA机构申请证书。整个过程有点像申请护照,需要向CA发送证书申请请求文件/CSR(
certificate signing request); - 一个CSR文件通常包括:
- 网站的域名;
- 网站的IP地址;
- 公司的名称;
- 公司的地理位置;
- 公司的邮箱地址;
- 公钥;
- CA机构接收到CSR文件后会进行信息核实,必要的时候还会引入人工审查。当核实无误后,CA就会向该站点签发一个证书并返回给申请者。申请者接收到CA签发的证书后,将其部署到网站的外部服务中即可(此时证书是在本地的)。
- 以Chrome为例,点击url栏最左侧的设置/锁头标志,再依次点击
以下介绍证书的工作原理:
- 每个证书都有一个唯一识别的指纹码,这是为了确保证书的完整性并唯一标识一个证书;
- 使用证书需要用到Hash计算: Hash计算:
- 是一种单向加密算法;
- 任意长度的字符串输入进过哈希算法后都只能得到一串长度相等的字符串/散列值 。散列值有两大特性:
- 不可逆,无法对一个散列值做逆向操作来获取其原始数据(
鸽巢原理); - 唯一性,一个数据经过哈希算法后得到的结果是唯一的。即使是同一输入计算出的散列值也是唯一的;
- 不可逆,无法对一个散列值做逆向操作来获取其原始数据(
- 在生成证书时,CA会分别对证书的内容和公钥进行Hash计算,并将得到的Hash值分别作为证书的指纹附加到证书中,同时说明使用的Hash算法;
- 服务端在已知算法的情况下,可以使用算法对证书的内容和公钥进行Hash计算,并和附加在本地证书中的指纹作对比。如果完全一致,则说明证书在网络传输的过程中没有被截获或者篡改。目前最常用的hash算法是Hash256;
- 除此以外,还需要检验证书的真实性,即证书真的是由证书所记载的机构所颁发的。此时,我们引入证书签名,通过PKI/公私钥对证书签名进行加密和解密:
- 证书签名的操作与TLS-加密对称相反(
私钥加密,公钥解密),它是CA用自己的私钥对证书进行加密,并将加密结果附加在证书中传回给服务器端;服务器端获取到证书后,会使用CA对应的公钥对其进行解密; - 如果解密结果与证书内容一致(
a+私钥=A=公钥+a),说明解密成功,服务器端使用的公钥和CA加密时使用的私钥是一对密钥; - 但是问题又回到了如何保证CA发送到服务器端的公钥是没有被掉包的呢。这就要用到预安装这项技术。
- 证书签名的操作与TLS-加密对称相反(
- 当CA对证书进行签名(
加密)时,不仅用到私钥,还会用到根证书。根证书最主要的作用,就是为其他证书签名。CA机构的公钥也被附加在根证书中。每一个操作系统都预安装好世界各地受信任的CA的根证书,并且都会经常维护。当需要验证证书签名时,则直接从系统中找到根证书取出公钥与发送来的公钥进行对比即可;
一个完整的TLS握手的过程
Client Server 本地系统中存有根证书 在服务器端建站之初就生成了公钥和私钥 TCP SYN TCP SYN + ACK TCP SYN TCP/IP三次握手 Client Hello 从客户端提供的中选出最优TLS版本 和加密算法 Server Hello 发送证书 验证证书的签名和指纹 使用系统中的CA公钥从证书中提取出服务器端的公钥 生成预主密钥,通过服务器端公钥进行加密 传递加密过的预主密钥 传递加密函数和算法等信息 通过服务器端的私钥解密加密信息获得预主密钥 通过加密函数和算法将预主密钥转化成会话密钥 通过相同的加密函数和算法将预主密钥转化成会话密钥 通讯双方通过会话密钥进行加密对话 通讯双方通过会话密钥进行加密对话 Client Server
- 在大多数语境中,都喜欢把TLS和SSL混为一谈,因为SSL的简称过于深入人心,实际上现在大家使用的已经不是第一版的TLS或者说SSL协议了,现在都是TLS了。