什么是SSL/TLS
- 网络要保证通讯安全,要保障的最主要的点,其实在前面都已经介绍了。就是:机密性、完整性、认证问题
- 我们把前面能够保证这些要求的技术环列一下:
- 保证机密性的对称密码,使用伪随机数生成的密钥,保证通讯双方都能安全获取密钥的公钥密码或Diffie-Hellman密钥交换
- 保证完整性的消息认证码,生成此认证码的单向散列函数
- 解决认证问题的数字签名和证书
- SSL/TLS实际上就是上面多种技术以某种方式组合在一起的组合套餐,以帮助实现通讯安全。
- HTTP、SMTP/POP3等应用层协议可以承载在SSL/TLS之上
- SSL和TLS大体是相同的,只有少量微妙的区别。
基于TLS 1.0讲解通讯过程
TLS协议结构
- TLS协议分成两层:TLS记录协议(TLS record protocol)、TLS握手协议(TLS handshake protocol)
-
TLS握手协议是负责加密以外的其他事情。握手协议分成4个子协议,分别是:握手协议、密码规格变更协议、警告协议、应用数据协议
- 握手协议:负责通信双方之间协商决定密码算法和共享密钥
- 密码规格变更协议:负责向通信对象传达变更密码方式的信号
- 警告协议:负责在发生错误时将错误传给对方
- 应用数据协议:是将TLS承载的应用数据传达给通讯对象
-TLS记录协议是负责消息的压缩、加密以及数据的认证。
- TLS记录协议使用到的所有的算法等都是经过握手协议协商确认后的,以保证通讯双方是使用相同的算法。
- 首先,消息会被 分割成多份,并用协商好的压缩算法进行压缩
- 其次,压缩片段会加上消息认证码以保证完整性,为了防止重放攻击还加上了片段编号。
- 再次,压缩后的消息片段会加上消息认证码一起进行加密。加密使用CBC模式,初始向量是通过主密码生成。
- 最后,加密后的报文,再加上数据类型、版本号、压缩后的长度组成的报头,就是最终的数据报文。
握手协议通信过程
-
ClientHello(客户端 -> 服务器)
- 客户端向服务端发送自己的信息:可用的版本号、当前时间、客户端随机数、会话ID、可用的密码套件清单、可用的压缩方式清单
- 可用的版本号、可用的密码套件清单、可用的压缩方式清单:因为不同的浏览器可能支持的情况不一样,所以需要发送给服务端以方便协商。
- 当前时间:TLS不使用,但是上层的协议有可能使用
- 客户端随机数:后面会使用到
- 会话ID:客户端和服务端需要重新使用之前的连接时,会使用到此信息。
-
ServerHello(服务器 -> 客户端)
- 服务端向客户端发送自己的信息:使用的版本号、当前时间、服务器随机数、会话ID、使用的密码套件清单、使用的压缩方式清单
- 使用的版本号、使用的密码套件清单、使用的压缩方式清单:这里发送的就是协商后的确定结果
- 当前时间:TLS不使用,但是上层的协议有可能使用
- 服务器随机数:后面会使用到
-
Certificate(服务器 -> 客户端)
- 就是发送服务器的证书
-
ServerKeyExchange(服务器 -> 客户端)
- 如果Certificate不足以满足需求时,则会发送ServerKeyExchange消息。具体的内容根据密码套件的不同而有所不同。
- 这个不是必须的
-
CertificateRquest(服务器 -> 客户端)
- 简单的说就是我们平时说的双向认证,即服务器找客户端要其证书用来验证
- 这个过程中,服务器会向客户端发送这些消息:服务器能够理解的证书类型、服务器能够理解的认证机构名称清单
-
ServerHelloDone(服务器 -> 客户端)
- 通知客户端hello时间结束
-
Certificate(客户端 -> 服务器)
- 第5步中如果服务器要了客户端的证书,则发送给服务器
-
ClientKeyExchange(客户端 -> 服务器)
- 这个就是最关键的一步,交换生成最终密钥的关键素材
- 如果是使用的RSA,则会将经过服务器公钥加密的预备主密码随着ClientKeyExchange消息一起发送
- 如果是Diffie-Hellman密钥交换,则随着ClientKeyExchange消息一起发送的是Diffie-Hellman公开值
- 预备主密码使得服务端和客户端分别计算出相同的主密码
- 主密码作为关键的密钥素材可以生成:对称密码的密钥、消息认证码的密钥、对称密码的CBC模式中使用的初始化向量
-
CertificateVerify(客户端 -> 服务器)
- 只有发送了第5步消息的时候,客户端才会向服务器发送CertificateVerify消息
- 这个消息是为了向服务器证明,自己确实是真实的客户端,拥有客户端证书的私钥。为了实现这个目的,客户端会计算主密码和握手协议种传送的消息的散列值加上自己的数字签名后发送给服务器。
-
ChangeCipherSpec(客户端 -> 服务器)
- 这不是握手协议,而是密码规格变更协议。客户端告诉服务器我要换密码了。
- 因为已经双方已经交换了密码套件信息,可以开始切换密码进行通信了。
-
Finished(客户端 -> 服务器)
- 客户端说我搞定了
-
ChangeCipherSpec(服务器 -> 客户端)
- 服务器告诉客户端,我要开始换密码了
-
Finished(服务器 -> 客户端)
- 服务器说我搞定了
切换至应用数据协议
主密码
- 主密码是根据下面信息计算出来的:预备主密码、客户端随机数、服务器随机数
- 如果是RSA,在握手的时候客户端就会把预备主密码发送给服务器;如果是Diffie-Hellman,则会发送公开值给服务器,然后客户端和服务器根据这个值生成预备主密码
- 客户端随机数和服务器随机数相当于为了防止攻击者事先计算出来的盐值
- 使用主密码生成对称密码的密钥、消息认证码的密钥、对称密码的CBC模式中使用的初始化向量
对SSL/TLS的攻击
- 既然是工具箱的组合,那么使用到的技术的攻击手法都可以进行攻击
- 对伪随机数生成器的攻击,主要是因为生成器的种子在时间和进程编号这样可预测的范围内的数值
- 利用证书时间差进行攻击,就是CRL列表提交了注销,但还未批准的时间差
SSL/TLS用户的注意事项
- 不要误解证书的含义。这点是最重要的,就是通过证书认证并不就代表服务器是正确的。很好理解,就是拥有合法身份证的人,不一定是你要转移钱的对象。
- 密码通信前数据不受保护
- 密码通信后数据不受保护