2

SSL/TLS

 2 years ago
source link: https://blog.kamino.link/2021/11/16/SSL%20TLS%E5%8D%8F%E8%AE%AE%E5%8E%9F%E7%90%86/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

SSL/TLS协议原理

SSL(Secore Socket Layer)是安全套接层,TLS(Transport Layer Security)是SSL的高级版本,一般叫做SSL/TLS,是计算机网络应用层的一种安全通信协议。SSL/TLS工作在TCP之上,HTTPS等应用之下,通过采用机密性、数据完整性、服务器鉴别和客户鉴别来解决安全问题。

SSL有三个阶段:握手、秘钥导出、数据传输

首先,蓝色部分是建立(不安全的)TCP连接的过程,这一部分就是TCP的三次握手,这一部分有的时候可能被忽略。

在建立TCP连接后,客户端向服务端传输一个包含一些基本信息的hello报文Client Hello。基本信息即SSL版本、会话ID、加密四件套列表、客户端随机数等。(图中未包含随机数)

之后,服务端从客户端支持的加密四件套中选择一种,然后把选择+CA证书+服务端随机数+SSL版本+会话ID组合成Server Hello返回给客户端。客户端收到证书之后验证证书,若验证成功,则客户端可确信服务端。

之后,客户端生成一个前主密钥(Pre Master Secret),再从证书中用服务端选择的方法提取服务端公钥,用服务端公钥加密PMS后传输给服务端。此时,双方都获得了此次SSL通话的前主密钥,即握手成功。

加密四件套:

ECDH-ECDSA-AES128-SHA256 :ECDH是秘钥交换算法、ECDS是证书算法(非对称密码)、AES128是数据加密算法(对称密码)、SHA256是MAC算法(Hash)。

PMS包含的不只是1个秘钥,而是4个秘钥,服务端和客户端能通过之前生成的两个随机数(客户端随机数和服务端随机数)各自用秘钥导出函数独立计算出主密钥(Master Secret),而MS可以分片成4个秘钥分别是客户端加密秘钥、客户端MAC秘钥、服务端加密秘钥、服务端MAC秘钥,这个过程叫做秘钥导出。

注意此处的MAC指的是Message Authentication Code,即消息认证码。MAC需要发送者和接收者共享一个MAC秘钥,发送者根据发送数据计算MAC值,将数据和MAC发给对方。接收者收到数据之后也计算MAC值,然后比对收到的MAC值,从而判断消息是否被改动。

在客户端和服务端都能计算出MAC后,客户端会立马发送所有握手报文的MAC值给服务端,而服务端收到后进行验证,也会发送所有握手报文的MAC值给客户端。

为什么最后还要互相传一次MAC:这两步使握手报文不被篡改,因为CLIENT HELLOSERVER HELLO这两个报文都是明文传输,假如没有这两步,那么可能会有人将客户端支持的加密算法改成较弱的算法,或者把SSL改成更弱的早期版本。

不直接传输MS的原因:通过PMS各自独立计算MS,不将其放在信道进行传输,可以从根源上防止MS泄露,保证其安全性。

添加随机数的原因:可以防止“连接重放攻击”:假如别人截取了你昨天在淘宝买东西的报文,然后今天重新发这个报文100次,没有随机数参与的话,那这个报文就是完全正确的了,你就会再买这个东西100次啦。

SSL将数据流分割成记录,对每个记录附加一个MAC,然后加密记录+MAC进行传输。对于MAC的计算,发送者将通过记录+序号hash计算MAC,序号初始为0,每发一个记录,序号就+1。这样就能防止中间人的重排序和重放报文。

参考文献

计算机网络:自顶向下方法(第7版) 机械工业出版社

认证篇——消息认证码_锦瑟常思的博客-CSDN博客_消息认证码

An overview of the SSL Handshake. In this post I will give an overview of… | by Robert van Rijn | Medium


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK