SSL/TLS的原理以及互联网到底是如何工做的(3)—TLS的专场
我: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,请求评价文档)大概会跳楼吧!算了,直接上图吧!
欢迎关注本站公众号,获取更多信息