一文搞懂SSL/TLS

简介: 一文搞懂SSL/TLS


1. 概述

安全套接字层(SSL,Secure Sockets Layer)是基于公钥密码体制和X.509数字证书技术,为网络通信提供身份认证以及数据传输保密性、完整性的一种安全协议。

1994年,网景(Netscape)公司提出了SSL1.0,历经多次修改,1996年正式发布SSL3.0。1997年互联网工程任务组(IETF,Internet Engineering Task Force)发布基于SSL协议的互联网草案:传输层安全协议(TLS,Transport Layer Security)。1999年,IETF发布了正式的行业标准RFC2246 ,TLS/SSL直正成为通信安全标准。

SSL/TLS是位于传输层与应用层之间的加密协议(属于Socket层实现),对于应用层来说是透明的,应用层数据通过传递给SSL层进行加密,并增加SSL头,再传递给传输层。

SSL/TLS均可提供身份认证、机密性和完整性服务,虽然SSL系列的所有版本都已经弃用,TLS作为SSL的后续版本,大家依然习惯使用SSL的叫法。

2. 协议组成

SSL协议由三部分组成:

  • 握手协议:协商加密算法、MAC算法以及会话密钥
  • 记录协议:对交换的数据进行加密和签名
  • 警报协议:解决出现的问题

2.1 握手协议(Handshake protocol)

握手协议是客户端和服务端建立SSL连接首先执行的协议,在传输数据之前完成,服务器和客户端使用这个协议相互鉴别对方的身份、协商加密算法、MAC算法以及加密数据使用的会话密钥。

(1)建立安全能力

  • Client Hello:客户端第一次连接到服务端时,将Client Hello作为第一条信息发给服务端,包含了客户端支持的加密组件(cipher_suite):加密算法、压缩算法、摘要算法,以及本次连接客户端生成的随机数。若客户端期望恢复上一次的会话还需发送会话ID。
  • Server HelloServer Hello是服务端对客户端Client Hello的回复,包含了服务端从Client Hello中选择的本次会话使用的加密算法、压缩算法、摘要算法,服务端确定的会话ID(session ID)、服务端的随机数。

(2)服务端认证与密钥交换

客户端利用服务器响应消息完成服务器真是身份的认证。

  • (Server) Certificate:若要求验证服务端,则服务端在Server Hello信息后发送其证书(certificate),通常为X.509v3版的Certificate。
  • Server Key Exchange:该消息补充以前在Server Hello消息声明中的密码组,为客户端提供继续通信所需要的算法变量(依赖于所选定的算法)。
  • Certificate Request:若服务端需要鉴别客户端的身份,它将向客户端发送Certificate Request。该消息包含了服务端可鉴别的证书类型和可信任的CA证书序列。
  • Server Hello Done:该信息表明Server Hello结束,等待客户端响应。客户端收到该信息后检查服务端提供的Certificate 是否有效,以及服务端的Hello参数是否可接受。

(3)客户端认证与密钥交换

  • (Client) Certificate:当服务端请求Certificate时,客户端收到服务端的Server Hello Done后发送该信息。若客户端没有合适的Certificate,则发送”没有证书”的警告信息。
  • Client Key Exchange:该消息内容取决于密钥交换算法类型
  • 若选择RSA算法,则该消息包含经RSA公钥加密的预加密主密钥(pre-master secret),其中RSA公钥为服务器证书中的公钥或Server Key Exchange服务端临时生成的RSA公钥
  • 若选择DH算法,则该消息包含客户端使用服务端传来的DH算法参数生成的公共值,该公共值将被生成预加密主密钥。
  • Certificate Verify:该消息用于提供客户端Certificate验证,仅在具有签名能力的客户端传送 Certificate后传送。

(4)完成握手

客户端与服务器端分别利用pre_master_secret生成真正的主密钥master_secret,再利用主密钥生成会话密钥session_keys,然后相互发送Change Cipher Spec,并确认。

  • Change Cipher Spec:用于发方告知收方,发方已完成加密规范改变,准备使用协商的加密套件件(Cipher Suite)和会话密钥(Session Key)加密数据并传输了,体现在数据包中就是一个字节的数据。
  • Finished:发方使用协商好的加密套件(Cipher Suite)和会话密钥(Session Secret)加密一段Finish数据传送给收方,收方在收到Finishe信息后须检查其内容是否正确,以是否成功建立加解密通道。

客户端和服务端对Finished信息进行验证,确定加密通道已经建立成功,双方就可使用产生的会话密钥(Session keys)加密传输数据了。

警报协议(Alert Protocol)

当客户机和服务器发现错误时,会向对方发送一个警报消息。如果是致命错误,算法立即终止会话并关闭SSL连接,同时删除相关会话记录、秘密和密钥。

2.2 记录协议(Record Protocol)

客户端和服务端完成鉴别并确定安全信息交换使用的算法后,进入SSL记录协议,主要提供两个服务:

  • 数据保密性:使用握手协议定义的秘密密钥对传送的数据加密。
  • 消息完整性:使用握手协议定义的带有MAC的密钥计算消息认证码。

记录协议接收到应用程序传送的消息,将数据分片(切成容易管理的小区块),然后选择是否对这些区块作压缩,再加上此区块的消息认证码,将数据区块与MAC一起做加密处理,加上SSL记录头后通过TCP传送出去。接收数据方对数据进行解密、验证、解压缩、重组,将消息的内容还原,传送给上层应用程序。

  • (1)分段:每个上层应用数据被分成2 14 2^{14}214(16K)或更小的数据块。
  • (2)压缩:压缩是可选的,且是无损压缩。
  • (3)增加MAC:使用MD5、SHA等Hash函数产生消息摘要MAC,在压缩数据上增消息认证MAC,用于数据完整性检查。
  • (4)加密:对压缩数据及MAC进行加密,保证数据的机密性。
  • (5)附加SSL报头输出

3. 密码套件与密钥生成

(1)密码套件(cipher_suite)

密码套件是一组选定的加密基元和其他参数,包括密钥交换算法、身份验证算法、数据加密算法和散列算法。

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA156表示:

  • 密钥交换:ECDHE
  • 身份验证:RSA
  • 数据加密算法:AES_128_GCM
  • MAC:SHA156

(2)密钥生成

  • 预主密钥(PreMaster secret):PreMaster Secret由客户在Client Key Exchange环节使用RSA或Diffie-Hellman等加密算法生成,并使用服务端的公钥对其加密后传送给服务端,服务端使用私钥解密得到PreMaster secret。
  • 主密钥(Master secret):主密钥(Master secret)用来生成各类加密算法密钥,由服务端和客户端使用PreMaster secret、客户端在Hello阶段产生的随机数、服务端在Hello阶段产生的随机数按如下规则生成:
Master secret=
MD5(premaster secret + SHA('A'  + premaster secret + ClientHello.random + ServerHello.random))+
MD5(premaster secret + SHA('BB' + premaster secret + ClientHello.random + ServerHello.random))+
MD5(premaster secret + SHA('CCC'+ premaster secret + ClientHello.random + ServerHello.random))

主密钥首先通过一系列散列运算生成一个足够长度的密钥块(Key Block),该密钥块的长度大于或等于SSL所需要的各类加密密钥的长度。随后SSL将该密钥块中的数据切分成各个加密密钥,如果切分完Key block 还有剩余,则直接将剩余抛弃。

客户端发送数据时:

  • 首先对数据附加Client write MAC key
  • 然后对数据包使用Client write encryption key加密
  • 服务端收到密文后使用Client write encryption key解密
  • 服务端使用Client write MAC key对数据的完整性进行验证

服务端发送数据时:

  • 首先对数据附加Server write MAC key
  • 然后对数据包使用Server write encryption key加密
  • 客户端收到密文后使用Server write encryption key解密
  • 客户端使用Server write MAC key对数据的完整性进行验证

4. SSL协议应用模式

(1)匿名SSL连接

这种模式是SSL安全连接的最基本模式,易于使用,常用的浏览器都支持这种方式,很合单向的安全数据传输应用。典型的应用是当用户进行网站注册时,为防止私信息(如信用卡号、口令、电话等)泄露,就采用匿名 SSL连接该网站。

该模式下客户端没有数字证书,用户以匿名方式访问服务器服务器具有数字证书,实现服务器的认证,以使用户能确认是自己要访问的站点。首次SSL连接时客户端需要下载服务器证书,然后随机地生成密钥,再用这个密钥进行SSL握协议,一个会话完成后,这个密钥就丢弃

(2)对等安全服务

这种模式通信双方都可以发起和接收 SSL 连接请求,既做服务器又做客户端,双方具有数字证书,实现服务器和客户端的双向认证,通信双方可以是应用程序或安全协议代务器(安全协议代理服务器相当于一个加密/解密网关,把内部部网络的访问转换为SSL数据包,接收时把 SSL数据包解密。)。

相关文章
|
3月前
|
安全 网络安全 数据安全/隐私保护
顺便再来看看SSL/TLS
顺便再来看看SSL/TLS
41 0
|
4月前
|
安全 网络安全 网络虚拟化
深入解析IDS/IPS与SSL/TLS和网络安全
防火墙 防火墙是一种网络安全设备,用于监控和控制网络流量,保护网络免受未经授权的访问、恶意攻击和威胁。防火墙可以基于规则进行数据包过滤,允许或阻止特定类型的流量通过。常见的防火墙类型包括网络层防火墙和应用层防火墙。 防火墙就像是你家的安全门,保护你的电脑网络不受坏人的攻击。它像一个警卫一样,只允许那些你信任的人进入你的网络,而把不好的人拒之门外。
137 0
|
7月前
|
存储 Java 网络安全
SpringCloud GateWay配置(TLS 和 SSL、Http超时配置)—官方原版
SpringCloud GateWay配置(TLS 和 SSL、Http超时配置)—官方原版
222 0
|
1月前
|
安全 Linux 网络安全
Qt SSL/TLS 安全通信类:构建安全网络应用的关键组件
Qt SSL/TLS 安全通信类:构建安全网络应用的关键组件
66 0
|
1月前
|
开发框架 安全 网络安全
Qt5.14.2揭秘Qt与SSL/TLS的完美邂逅:打造坚不可摧的网络安全防线
Qt5.14.2揭秘Qt与SSL/TLS的完美邂逅:打造坚不可摧的网络安全防线
|
6月前
|
算法 网络安全 开发工具
TLS/SSL 协议-非对称加密(RSA)原理
TLS/SSL 协议-非对称加密(RSA)原理
147 0
|
7月前
|
监控 安全 网络安全
聊一聊 TLS/SSL
聊一聊 TLS/SSL
|
3月前
|
安全 网络安全 数据安全/隐私保护
|
3月前
|
安全 Java 网络安全
HTTPS的TLS/SSL协议详解及Java代码示例
HTTPS的TLS/SSL协议详解及Java代码示例
268 0
|
4月前
|
安全 算法 应用服务中间件
TLS SSL
TLS SSL
49 0