SSL/TLS的原理以及互联网究竟是如何工作的(3)—TLS的专场

来源:互联网 发布:淘宝欠款多少会被起诉 编辑:程序博客网 时间:2024/05/16 06:30
我:hi,TLS!这次是你的专场哦!

TLS:OK,那我就开始了!首先,我的大名叫做Transport Layer Security Protocol(传输层安全协议),是SSL的升级版。实际上我的左手和右手都是能用的,左手叫Record Layer(记录层),右手叫Handshake Layer(握手层)......

我:喂喂,等一下,记录层?握手层?这都是什么啊?

TLS:别打断我!听我慢慢解释:TLS是基于TCP的可靠连接,而想要建立一个可靠连接就必须有一个被称为握手的过程,TCP就有啊(TCP:没错,我建立连接时就要经历three-way handshake(三路握手)的,这具体过程是......)

我&TLS:STOP!TCP,有空会给你开个专场的,现在你先暂时回去工作吧!(TCP:OK,说定了哦!)

TLS:继续吧,TCP有握手过程,那么我也一样,你也可以把我的握手过程看成是在TCP握手过程基础之上的改进。
开始说具体过程了!

首先,客户端向服务器端发送一个message,名叫"client hello",包括SSL/TLS协议的版本号,客户端生成的随机数(P1,P指Parameter,参数)以及客户端支持的加密算法;

然后,服务器端发送另一个message,名叫"server hello",确认所使用的加密算法以及生成并发送另一个随机数(P2),特别注意还有服务器端的数字证书[呢......


我:等一下,数字证书?为什么会这么早就出现了?

TLS:我说,你是怎么想的?难道你认为要连接建立开始传输用户数据之后才进行基于数字证书的身份认证吗?

我:为什么不行呢?先完成握手,建立连接,然后马上进行身份认证,似乎也不晚呢......

TLS:你!真!是!个!大!笨!蛋!连接建立之后首先一定是客户端数据被发送过去的,在浏览网页的情况下就是GET请求的HTTP数据包,如果不在此之前进行身份认证,那么这个数据包很可能会落到冒充目标网站服务器的第三方手里(也就是所谓的中间人攻击)!而你还没有任何办法!

我:就一个GET数据包,好像也不会怎么样......

TLS:I 服了 YOU!你知道网站的自动登录功能是怎么实现的吗?是cookie的功劳!第一次登陆成功之后你的用户名和密码就被储存在了cookie里,再次登录时浏览器就会在一开始的GET数据包中加入这个cookie,准确来说是加入数据包头部(HTTP Headers),cookie本身就是一种特殊的HTTP headers!在一开始用户名和密码就发过去了,那么传回来的就是登录之后的界面了,这就是自动登录的奥秘!

我:啊,我明白了!如果是启用了自动登录的网站被中间人攻击了,那么一旦不能在第一个用户数据包被传输之前发现这一点,那么用户账户就直接落到第三方手里了!先不说cookie的加密根本就不强,其实第三方都不需要破解加密的,只要直接利用手里的cookie就能完成登录从而为所欲为了!

TLS:没错,就是这样!所以身份认证过程一定要在握手阶段就完成!
接着说吧:
身份认证可以是双向的,也就是说服务器端也可以向客户端请求证书,认证过程也是类似的,简单来说就是对比签名和私钥还有主机名等,一般情况下这个匹配过程是很严格的,第三方的伪造证书很难过关。顺便说一句,身份认证时使用的算法和最终加密时使用的算法很多时候是同一个。对于浏览器,他自己信任着和不信任着一套证书,IE和chrome依据操作系统自带的证书系统,firefox则有着自己的一套证书系统。这些证书都是由可信赖的第三方证书颁发机构(Certficate Authority)颁发的,一般情况下没问题,除了一个大流氓之外......

我:哪个大流氓?啊,想起来了,以前好像听你说过,CNNIC(中国互联网信息中心),不过到底是怎么回事啊?

TLS:这次我没空解释,下次我在说明中间人攻击的具体过程时就会好好说明的。先继续吧:
身份认证没有问题之后,客户端就会再生成一个随机数(P3),并用数字证书上的公钥进行加密之后再传输给服务器端。这里采用的是非对称加密算法,就以G+为例吧:”并使用ECDHE_ECDSA作为密钥交换机制“,这个ECDHE_ECDSA就是一种公钥算法(又叫做非对称算法),加密公钥是公开的,解密私钥是秘密的,所以第三方无法得知P3的值。服务器端收到之后就用自己的私钥解密得到P3,然后发送message通知客户端自己收到了。

接下来,服务器和客户端根据约定的加密算法,同时用手中的P1,P2和P3算出秘密的session key(会话金钥),一般情况下是128位或者256位,然后客户端再用这个金钥加密以后所有需要传输的用户数据再进行传输。这里有必要提一下,此时的传输单元被称作socket(套接字),应用层协议(如HTTP)先处理好数据,再被完全加密(包括头部),再被注入到套接字中,这些套接字除了源地址和目的地址还有必要的完整性验证机制以及其他保证可靠性所需要的数据之外其他一切都是被强加密的。SSL(Secure Socket Layer,安全套接字层)的名字也是这么来的。

以上就是握手的全过程,握手层完成握手之后就是记录层在TCP的帮助之下负责传输了,请注意握手时采用的密钥交换算法和传输时采用的数据加密算法不是同一个,传输时的数据加密算法是对称加密算法,密钥就是通过握手最终算出来的那个会话金钥,以G+为例,这个算法就是CHACHA20_POLY1305。

我:(头昏眼花)真的很复杂啊......

TLS:晕死,你看到那份100多页的RFC(Request For Comment,请求评价文档)大概会跳楼吧!算了,直接上图吧!

我:谢谢啊(笑)。
0 0
原创粉丝点击