理解SSL/TLS协议web
背景算法
早期咱们在访问web时使用HTTP协议,该协议在传输数据时使用明文传输,明文传输带来了如下风险:安全
一、信息窃听风险,第三方能够获取通讯内容ide
二、信息篡改风险,第三方能够篡改通讯内容ui
三、身份冒充风险,第三方能够冒充他人身份参与通讯加密
为了解决明文传输所带来的风险,网景公司在1994年设计了SSL用于Web的安全传输协议,这是SSL的起源。IETF将SSL进行标准化,1999年公布了初版TLS标准文件。随后又公布了 RFC 5246(2008年8月)与 RFC 6176 (2011年3月)。该协议在web中被普遍应用。spa
SSL/TLS协议设计
TLS(Transport Layer Security,传输层安全协议),及其前身SSL(Secure Sockets Layer,安全套接层)是一种安全协议,目的是为互联网通讯,提供安全及数据完整性保障。xml
TLS协议使用如下三种机制为信息通讯提供安全传输:blog
一、隐秘性,全部通讯都经过加密后进行传播
二、身份认证,经过证书进行认证
三、可靠性,经过校验数据完整性维护一个可靠的安全链接
工做机制:
TLS协议由两部分组成,包括(TLS Record Layer,TLS handshake protocol)
Record Layer:
为每条信息提供一个header和在尾部生成一个从Message Authentication Code (MAC) 获得的hash值,其中header由5 bytes组成,分别是协议说明(1bytes),协议版本(2bytes)和长度(2bytes),跟在header后面的协议信息长度不得超过16384bytes。
Handshake Protocol:
开始一个安全链接须要客户端和服务端通过反复的创建握手。一个TLS握手须要通过以下几个步骤:
图片来源:http://www.esds.co.in/blog/wp-content/uploads/2015/11/ssl_handcheck2-660x787.png
首先仍是要通过TCP三次握手创建链接,而后才是TLS握手的开始:
ClientHello:Client端将本身的TLS协议版本,加密套件,压缩方法,随机数,SessionID(未填充)发送给Server端
ServerHello:Server端将选择后的SSL协议版本,压缩算法,密码套件,填充SessionID,生成的随机数等信息发送给Client端
ServerCertificates:Server端将本身的数字证书(包含公钥),发送给Client端。(证书须要从数字证书认证机构(CA)申请,证书是对于服务端的一种认证),若要进行更为安全的数据通讯,Server端还能够向Client端发送Cerficate Request来要去客户端发送对方的证书进行合法性的认证。
ServerHelloDone:当完成ServerHello后,Server端会发送Server Hello Done的消息给客户端,表示ServerHello 结束了。
ClientKeyExchage:当Client端收到Server端的证书等信息后,会先对服务端的证书进行检查,检查证书的完整性以及证书跟服务端域名是否吻合,而后使用加密算法生成一个PreMaster Secret,并经过Server端的公钥进行加密,而后发送给Server端。
ClientFinishd:Client端会发送一个ChangeCipherSpec(一种协议,数据只有一字节),用于告知Server端已经切换到以前协商好的加密套件的状态,准备使用以前协商好的加密套件加密数据并进行传输了。而后使用Master Secret(经过两个随机数、PreMaster Secret和加密算法计算得出)加密一段Finish的数据传送给服务端,此数据是为了在正式传输应用数据以前对刚刚握手创建起来的加解密通道进行验证。
Server Finishd:Sever端在接收到Client端传过来的加密数据后,使用私钥对这段加密数据进行解密,并对数据进行验证,而后会给客户端发送一个ChangeCipherSpec,告知客户端已经切换到协商过的加密套件状态,准备使用加密套件加密数据并传输了。以后,服务端也会使用Master Secret加密一段Finish消息发送给客户端,以验证以前经过握手创建起来的加解密通道是否成功。
根据以前的握手信息,若是客户端和服务端都能对Finish信息进行正常加解密且消息正确的被验证,则说明握手通道已经创建成功。
接下来,双方全部的通讯数据都经过Master Secret进行加密后传输。
参考:
https://en.wikipedia.org/wiki/Transport_Layer_Security
https://www.sans.org/reading-room/whitepapers/protocols/ssl-tls-beginners-guide-1029