TLS\SSL详解
TLS协议是IETF将SSL协议的进一步标准化 , 采纳为国际标准基本上,SSL 3.0等于TLS 1.0
SSL、TLS基于PKI技术的、提供机密性、鉴别、完整性的具体解决方案
安全通道是透明的,独立于应用层;传输层采用TCP,提供可靠业务
作为一个中间层,应用程序只要采用SSL提供的一套SSL套接字API来替换标准的Socket套接字,就可以把程序转换为SSL化的安全网络程序,在传输过程中将由SSL协议实现数据机密性和完整性的保证,如HTTP+SSL---->HTTPS
SSL的功能
客户对服务器的身份鉴别
SSL服务器允许客户的浏览器使用标准的公钥加密技术和一些可靠的鉴别中心(CA)的证书,来确认服务器的合法性。
服务器对客户的身份鉴别
可通过公钥技术和证书进行鉴别,也可通过用户名,password来鉴别。
建立服务器与客户之间安全的数据通道
SSL要求客户与服务器之间的所有发送的数据都被发送端加密、接收端解密,同时还检查数据的完整性
SSL提供的安全服务
用户和服务器的合法性鉴别
using X.509v3 digital certificates,RSA非对称加密算法,对应国产密码算法SM2
传输数据的机密性
using one of DES, Triple DES, IDEA, RC2, RC4,AES对称加密算法 对应国产密码算法SM4
传输数据的完整性
using MAC with MD5 or SHA-1,不可逆加密算法用于验证数据一致性和完整性,对应的国产密码算法SM3
SSL架构
协议可以分为:
- Record
- Change Cipher Spec
- Alert
- Handshake
- Application Data
Record为其它类型数据提供服务(目前4种,可扩展)
TCP提供有序的可靠传输:序号、重传/确认机制等
TCP的功能正是TLS所需要的,序号、重传/确认机制,并没有在Record层实现。所以,TLS/Record必须建立在TCP之上
或者是其它的可靠连接,不能用在UDP之上。
SSL大致运行流程
SSL Handshake
发生在TCP连接建立之前
类似于三次握手,上边HTTPS的握手过程
服务器和客户端完成以下任务
协商一套密码算法:对称密码算法,HMAC算法……
服务器鉴别(强制),客户端通过服务器发送的证书
客户端鉴别(可选),服务器通过客户端发送的证书。可选的原因是很多用户可能并没有或不关心证书
鉴别完成后,使用公钥密码进行密钥(随机数)交换,产生会话密钥(用于对称加密)
SSL Change Cipher Spec
通知对方,切换算法
Handshake协商之后,双方分别发送Change Cipher Spec
启用已经协商好的算法
A向B发送,表示“A写的数据”都用切换后的算法
B向A发送,表示“B写的数据”都用切换后的算法
SSL Alert
发送警告消息,各种错误:
- 通知关闭
- MAC错误
- 解密错误
- 解压错误
- 算法不支持
- 协议版本不支持
- 证书被撤销/过期
- 等等等
SSL Record
Record
为上面3类协议传输的数据
维护了密码功能参数、执行密码功能
在传输时,根据密码功能参数、进行相应的加解密、HMAC、压缩/解压等等
注意:有可能当前算法是NULL(如在Handshake过程中、双方未协商完),相当于是直接明文传输
当上层数据经过,Record层就根据自己所维护的密码功能参数、进行密码计算,得到变换后的数据
然后交给TCP发送
上层数据是Handshake/Alert/Application Data等
协商过程
Record层的各种密码运算参数,都是由Handshake层协商得到的
协商过程,大致如下:
- Client/Server相互发送随机数(明文)—上边HTTPS的握手过程没有提到
- 选定算法
- Server发送自己的公钥证书
- Client产生premaster secret,用Server公钥加密,发送
- Server解密,双方共享相同的premaster secret和随机数
- 由此计算产生,从而R/W Key/IV/MAC_Secret
Handshake层的具体过程
Handshake消息的结构
Handshake消息,作为TLSPlaintext传输
Handshake消息,又可分为多类,分别用在Handshake过程中的各步骤
最基本/简单过程中,只使用了其中的部分类型的Handshake消息,有些类型的消息,只在特定场合出现,如certificate_verify,只用在鉴别Client的需要
简单过程-1
C: ClientHello
- 32 bytes随机数:4字节时间+28字节随机数
- 支持的最高协议版本
- 支持的算法列表
- Session ID,为了Session重用、可选
简单过程-2
S: ServerHello
32 bytes随机数:4字节时间+28字节随机数
选定协议版本和算法
Session ID,为了Session重用、可选
简单过程-3
S: Certificate
Server证书链,从Server证书开始的完整链
含有RSA公钥
S: ServerHelloDone
简单过程-4-RSA
C: ClientKeyExchange
- 根据SeverHello选定的密钥协商算法-RSA
- 生成48字节随机数
- 在验证Server证书有效后,用Server证书公钥加密
共享premaster secret
Client和Server共享了如下信息:
- 32字节ClientHello.random
- 32字节ServerHello.random
- 48字节Premaster secret(秘密)
- 假定Server拥有私钥进行解密,在使用RSA算法时,Premaster secret是48字节,DH算法时,不是48字节
产生Master Secret:先基于premaster secret(32字节ClientHello.random、32字节ServerHello.random、48字节Premaster secret)产生48字节的master secret
双方掌握相同的master secret,如下
具体的PRF()算法,参考RFC 2246,双方独立地进行计算
再基于48字节master secret、32字节Client.random和32字节Server.random产生随机数
简单过程-5
C: ChangeCipherSpec
- 通知Server启用协商好的算法
- Client切换Write State
- Server切换Read State
C: Finished
如下,注意此时已经有启用各种算法保护,handshake_messages是handshake过程所有信息
简单过程-6
S: ChangeCipherSpec
- 通知Client启用协商好的算法
- Server切换Write State
- Client切换Read State
S: Finished
类似,除了使用的是“server finished”
完成协商
开始Application Data
双方接到对方的Finished消息、校验没有问题后开始传输Application Data
完整的简单过程
OpenSSL
目前,使用最为广泛SSL/TLS开发库是OpenSSL
- 公开源代码,C语言实现
- 用于多种操作系统平台
- 可以从www.openssl.org获得
OpenSSL封装了SSL/TLS协议的细节
- 可以通过调用OpenSSL的几个简单的函数来,与对方建立安全会话
- 发送数据(由OpenSSL进行加密、MAC)
- 接受数据(由OpenSSL进行解密、验证MAC)
中间人攻击
- 能够通过ARP 欺骗、DNS 欺骗或者浏览器数据重定向等欺骗技术,使得SSL客户端C和服务器端S的数据都流向SSL MITM攻击机M
- SSL客户端用户在接收到SSL MITM攻击机伪造的数字证书后,被骗取对该证书的信任,并继续SSL连接
- SSL服务器未要求进行SSL客户端身份鉴别