概述

  • SSL协议可用于保护正常运行于TCP之上的任何应用协议,如HTTP、FTP、SMTP、Telnet的通信,最常见的是用来保护HTTP的通信
  • SSL协议的有点在于它是与应用层协议无关的。高层的应用协议都能透明的建立在SSL之上。
  • SSL协议在应用层协议之前就已经完成了加密算法,通信密钥的协商以及服务器的认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的安全。

SSL主要功能

客户端对服务器的身份认证

SSL服务端运行客户端浏览器使用标准的公钥加密技术和一些可靠的认证中心(CA)的证书,来确认服务端的合法性。

服务端对客户端的身份认证

服务端同样可以通过公钥和证书进行认证,也可以通过用户名密码来进行认证

建立服务端与客户端之间的安全数据通道

SSL要求客户端与服务端之间所发送的数据都被发送端加密、接收端解密,同时还检查数据的完整性

所处协议栈位置

image.png

SSL协议的分层模型

SSL协议是一个分层的协议,共有两层组成。处于SSL协议底层的是SSL记录层协议(SSL Record Protocol),它位于可靠的传输层协议(TCP)之上,用于封装高层协议的数据。其中SSL握手协议(SSL Handshake Protocol)允许服务方和客户方互相认证,并在应用层协议传送数据之前,协商出一个加密算法和会话秘钥。
image.png

SSL的两个概念

SSL连接(connection)

  • SSL的连接是点对点的关系
  • 连接是暂时的,每一个连接和一个会话关联

SSL会话(session)

  • 一个SSL会话是在客户与服务器之间的一个关联。会话由Handshake Protocol创建。会话定义了一组可供多个连接共享的密码安全参数。
  • 会话用以避免为每一个连接提供新的安全参数所需要昂贵的协商代价(访问bilibili 使用一个SSL,访问起子域也是这一个SSL会话)

image.png

主要的动作流程

SSL工作流程

1.网络连接建立,SSL客户端发送消息,消息中包含SSL版本号、密码设置、可实现的算法列表、随机数以及服务器试用SSL协议通信所需的其他信息
2.SSL服务端响应,确定SSL版本号、加密算法和压缩算法
3.SSL服务器发出服务器数字证书
4.SSL客户端的身份认证是可选的
5.客户端生成预主秘钥pre_master_secret,用服务器的公钥加密后返回服务器,服务器利用自己的私钥解密后得到会话秘钥。
6.如果服务器要求客户认证,客户则会向服务器随加密的pre_master_secret一起发送签名的数据和客户自己的证书。
7.服务器若认证客户成功,则使用私钥加密pre_master_Secret,然后执行一系列的步骤生成master secret。否则会话终止。
8.客户机与服务器使用master secret生成会话密钥。该密钥是对称密钥,用于加密和解密在SSL会话期间交换的信息,检验信息完整性。
9.C S:发送消息通知以后从客户机来的消息将会用会话密钥加密。客户机然后发送一条独立的(加密的)消息表明握手的客户机部分已经完成。

应用数据的传输过程

发送方

1.应用程序把应用数据提交给本地的SSL;
2.发送端的SSL根据需要:
使用握手中指定的压缩算法,压缩应用数据
使用MD5对压缩后的数据进行计算,计算hash值
把hash值与数据一起用加密算法加密 (防止中间数据被篡改)
3.密文通过网络传送给对方

接收方

用相同的加密算法对密文解密,得到明文
用相同的MD5对明文中的应用数据进行计算
通过上一步的计算与明文中传递来的值进行比较
5.如果一致,则明文有效,接收方的SSL把明文解压后得到应用数据上交给应用层。否则就丢弃数据,并向发送方发出告警信息。严重的错误有可能引起再次协商或者连接中断。

握手协议的功能

  • 协商SSL协议的版本
  • 协商加密套件
  • 协商密钥参数
  • 验证通讯双方的身份(可选项)
  • 建立SSL连接

握手层的过程

无客户端认证的握手过程

image.png

有客户端认证的握手过程

image.png

会话恢复过程

image.png

SSL记录层的功能

  • 保护传输数据的私密性,对数据进行加密和解密
  • 验证传输数据的完整性,计算报文hash
  • 提高传输数据的效率,对报文进行压缩
  • 保证数据传输的可靠和有序

数据包通信的过程

请求mail.163.com
首先是DNS请求,随后是TCP与80进行握手,发现是https,然后301到443
握手后进入SSL握手

  • Clienthello:发送客户端的功能和首选项给服务器,在连接建立后,当希望重协商、或者响应服务器的重协商请求时会发送。
    • version:客户端支持的最佳协议版本
    • Random:共32字节,28字节随机数,4字节额外信息,受客户端时钟影响(为了避免浏览器指纹采集,现在一般会对4字节时钟做扭曲)
    • Session ID:32字节随机数,用于和服务器重建会话,为空表示新建会话
    • cipher suit:客户端支持的所有密码套件,按优先级排列
    • Compression:客户端支持的压缩算法,默认无压缩
    • Extensions:由任意数量的扩展组成,携带额外数据
  • ServerHello:
    • 选择客户端提供的参数反馈客户端
    • 服务器无需支持客户端支持的最佳版本,如果服务器不支持客户端版本,可以提供其他版本以期待客户端可以接受
  • Certificate:
    • 用于携带服务器X.509证书链
    • 主证书必须第一个发送,中间证书按照正确的顺序跟在主证书之后
    • 服务器必须保证发送的证书和选择的算法套件一致
    • Certificate消息时可选的
  • ServerKeyExchange: 携带密钥交换的额外数据,取决于加密套件
  • ServerHelloDone:服务器已将所有预计的握手消息发送完毕
  • ClientkeyExchange:携带客户端为密钥交换提供的信息
  • ChangeCipherSpec:发送端已取得用以连接参数的足够的信息
  • Finish:握手完成,消息内容加密,双方可以交换验证,整个握手完整性所需的数据
    • 算法:verrify_data = PRF(master_secret , finished_label,hash(handshake_message))

image.png

client hello
image.png

server hello
image.png
交互的过程
image.png