参考文章:SSL协议介绍

SSL原理

什么是SSL

SSL是一种安全套接层协议,是Web浏览器与Web服务器之间安全交换信息的协议,提供两个基本的安全服务:鉴别与保密。

SSL协议的三个特性

  • 保密:

    在握手协议中定义了会话密钥后,所有的消息都被加密

  • 鉴别

    可选的客户端认证,和强制的服务器端认证

  • 完整性

    传送的消息包括消息完整性检查(使用MAC)

SSL的位置

SSL截图应用层和TCP层之间,应用层数据不再直接传递给传输层,而是传递给SSL层,SSL对从应用层收到的数据进行加密,并增加自己的SSL头

graph TD

应用层 --> SSL或TLS

SSL或TLS --> TCP

TCP --> IP

SSL组成

SSL的体系结构中包含两个协议子层,其中底层是SSL记录协议层;高层是SSL握手协议层

SSL协议主要分为两层

  • SSL记录协议层的作用是为高层协议提供基本的安全服务。SSL记录协议针对HTTP协议进行了特别的设计,使得超文本的传输协议HTTP能够在SSL运行。记录封装各种高层协议,具体实施压缩解压缩、加密解密、计算和校验MAC等与安全有关的操作。

  • SSL握手协议层包括SSL握手协议、SSL密码参数修改协议和SSL警报协议。握手层的这些协议用于SSL管理信息的交换,允许应用协议传输数据之间相互验证,协商加密算法和生成密钥等。

    SSL握手协议的作用是协调客户和服务器的状态,使双方能够达到状态的同步。

SSL工作过程

握手

握手协议是客户机和服务器用SSL连接通信时使用的子协议,握手协议包括客户机与服务器之间的一系列消息。SSL中复杂的协议是握手协议。该协议允许服务器和客户机相互验证,协商加密和MAC算法以及保密密钥,用来保护在SSL记录中发送的数据。握手协议是在应用程序的数据传输之前使用的。

每个握手协议包含以下3个字段

  • Type:

    表示10中消息类型之一,长度1字节

  • Length:

    表示消息长度字节数,长度3字节

  • Content:

    与消息相关的参数

第一阶段-建立安全能力

SSL握手的阶段启动逻辑连接,建立这个连接的安全能力。首先客户机向服务器发出client hello消息并等待服务器响应,随后服务器向客户机翻回server hello消息,对client hello消息中的信息进行确认。

ClientHello消息包括Version,Random,Session id, Cipher suite,Compression method等信息

    sequenceDiagram
    participant client as 客户
    participant server as 服务器

    client ->> server: 版本 客户随机数 会话ID
密码套件 压缩方法 server ->> client: 版本 服务器随机数 会话ID
选择密码套件 选择压缩方法

ClientHello 客户发送 ClientHello 信息,包含如下内容:

  • 客户端可以支持SSL高版本号

  • 一个用于生成主秘密的32字节的随机数

  • 一个确定会话的会话ID

  • 一个客户端可以支持的密码套件列表

    密码套件格式:每个套件都以“SSL”开头,紧跟着的是密钥交换算法。用“With”这个词把密钥交换算法、加密算法、散列算法分开,例如:SSL_DHE_RSA_WITH_DES_CBC_SHA,表示把DES_RSA(带有RSA数字签名的暂时Diffie-HellMan)定义为密钥交换算法;把DES_CBC定义为加密算法;把SHA定义为散列算法。

  • 一个客户端可以支持的压缩算法列表

ServerHello服务器用ServerHello信息应答客户,包括下列内容

  • 一个SSL版本号。取客户端支持的高版本号和服务端支持的高版本号中的较低者

  • 一个用于生成主秘密的32字节的随机数。(客户端一个、服务端一个)

  • 会话ID

  • 从客户端的密码套件列标中选择的一个密码套件

  • 从客户端的压缩方法的列表中选择的压缩方法

在这个阶段后,客户端服务端了解下列内容:

  • SSL版本

  • 密钥交换、信息验证和加密算法

  • 压缩方法

  • 有关密钥生成的两个随机数

第二阶段-服务器鉴别与密钥交换

服务器启动SSL握手第二阶段,是本阶段所有消息的发送方,客户机是所有消息的接收方。该阶段共有4步:

  • 证书:

    服务端将自己的证书下发给客户端,让客户端验证自己的身份,客户端验证通过后取出证书中的公钥。

  • 服务器密钥交换(可选):

    根据之前确定的密钥交换方式(RSA或DH等),包含完成密钥交换所需的一系列参数(例如DH算法要发送DH参数,RSA算法无需服务器密钥交换)。

  • 证书请求:

    服务器用来验证客户端。服务器端发出Certificate Request消息,要求客户端发他自己的证书过来进行验证。该消息中包含服务器端支持的证书类型(RSA、DSA、ECDSA等)和服务器端所信任的所有证书发行机构的CA列表,客户端会用这些信息来筛选证书。

  • 服务器握手完成:

    服务器所有信息发送完毕,等待客户端消息。

    sequenceDiagram
    participant client as 客户
    participant server as 服务器

    note right of server: 证书
        server ->> client: 一系列证书

    note right of server: 服务器密钥交换
        server ->> client: 服务器公钥

    ote right of server: 证书请求
        server ->> client: 可接受证书列表
可接受验证列表 ote right of server: ServerHelloDone server ->> client: 无内容

这里重点介绍一下服务端的验证和密钥交换。这个阶段的前面的 *证书 和 *服务器密钥交换 是基于密钥交换方法的。而在SSL中密钥交换算法有6种:无效(没有密钥交换)、RSA、匿名Diffie-Hellman、暂时Diffie-Hellman、 固定Diffie-Hellman、Fortezza。

在阶段1过程客户端与服务段协商的过程中已经确定使用哪种密钥交换算法。

如果协商过程种确定使用RSA交换密钥,那么过程如下图:

    sequenceDiagram
    participant client as 客户
    participant server as 服务器

    note right of server: 证书
        server ->> client: RSA Enc-cert

    server ->> client: 无服务器密钥交换

这个方法中,服务器在它的第一个信息中,发送了RSA加密/解密公钥证书。不过,因为预备主秘密是由客户端在下一个阶段生成并发送的,所以第二个信息是空的。

注意,公钥证书会进行从服务器到客户端的验证。当服务器收到预备主秘密时,它使用私钥进行解密。服务端拥有私钥是一个证据,可以证明服务器是一个它在第一个信息发送的公钥证书中要求的实体。

第三阶段-客户机鉴别与密钥交换

    sequenceDiagram
    participant client as 客户
    participant server as 服务器

    note left of client: 证书
        client ->> server: 证书链

    note left of client: 客户密钥交换
        client ->> server: 客户公钥

    note left of client: 证书验证
        client ->> server: 证明证书的散列代码

客户机启动SSL握手第三阶段,是本阶段所有消息的发送方,服务器是所有消息的接收方。该阶段分为3步:

  • 证书(可选):

    依据服务器要求发送证书,如果没有则发送no_certificate警告。

  • 客户机密钥交换:

    按照不同的密钥交换算法,算出一个pre-master,使用公钥加密发送给服务器。

    服务器端收到pre-master用私钥解密,结合之前收到的随机数,算出main master。

    而客户端当然也能自己通过pre-master算出main master。如此以来双方就算出了对称密钥。

    如果是RSA算法,会生成一个48字节的随机数,然后用server的公钥加密后再放入报文中。

    如果是DH算法,这是发送的就是客户端的DH参数,之后服务器和客户端根据DH算法,各自计算出相同的pre-master secret.

  • 证书验证(可选):

    只有在客户端发送了自己证书到服务器端,这个消息才需要发送。其中包含一个签名,对从第一条消息以来的所有握手消息的HMAC值(用master_ secret)进行签名。

下面也重点介绍一下RSA方式的客户端验证和密钥交换。

S🔒:用服务器公钥S加密
Sigc:用客户公钥签名

    sequenceDiagram
    participant client as 客户
    participant server as 服务器

    client ->> server: 无证书

    note left of client: 客户密钥交换
        client ->> server: S🔒(预备主秘密)

这种情况,除非服务器在阶段II明确请求,否则没有证书信息。客户端密钥交换方法包括阶段II收到的由RSA公钥加密的预备主密钥。

阶段III之后,客户要由服务器进行验证,客户和服务器都知道预备主密钥。

第四阶段-完成

    sequenceDiagram
    participant client as 客户
    participant server as 服务器

    note left of client: 改变密码规格
        client ->> server: 改变密码规格值

    note left of client: 完成
        client ->> server: MD5散列 + SHA散列

    note right of server: 改变密码规格
        server ->> client: 改变密码规格值

    note right of server: 完成
        server ->> client: MD5散列 + SHA散列

客户机启动SSL握手第4阶段,使服务器结束。该阶段分为4步,前2个消息来自客户机,后2个消息来自服务器

客户机:

  • 编码变更通知

  • 完成:

    握手结束通知:使用HMAC算法计算收到和发送的所有握手消息的摘要,然后通过RFC5246中定义的一个伪函数PRF计算出结果,加密后发送

服务器:

  • 计算得到协商密钥:

    enc_key=Fuc(random_C, random_S, Pre-Master);

  • 计算之前所有接收信息的 hash 值,然后解密客户端发送的 encrypted_handshake_message,验证数据和密钥正确性;

  • 发送一个编码变更通知

  • 使用Session Secret加密一段 Finish 消息发送给客户端,以验证之前通过握手建立起来的加解密通道是否成功

第五阶段-密钥生成的过程

握手协议完成,下面看什么是预备主密钥,主密钥是怎么生成的。为了保证信息的完整性和机密性,SSL需要六个加密秘密。为了信息的可信性,客户端需要一个密钥;为了加密,需要一个密钥;为了分组加密,要一个IV。服务端同样如此。SSL需要的密钥是单项的,不同于在其他方向的密钥。如果在一个方向上有攻击,在其他方向上是没有影响的。

记录

记录协议在客户机和服务器握手成功后使用,即客户机和服务器鉴别对方和确定安全信息交换使用的算法后,进入SSL记录协议,记录协议向SSL连接提供两个服务:

  • 保密性:使用握手协议定义的秘密密钥实现

  • 完整性:握手协议定义了MAC,用于保证消息完整性

记录协议的过程:

记录协议的过程.png

警报

客户机和服务器发现错误时,向对方发送一个警报消息。如果是致命错误,则算法立即关闭SSL连接,双方还会先删除相关的会话号,秘密和密钥。每个警报消息共2个字节,第1个字节表示错误类型,如果是警报,则值为1,如果是致命错误,则值为2;第2个字节制定实际错误类型。

使用wireshark分析SSL握手过程

电脑连接校园网无线网,本机IPv6地址为:2001:250:4402:1119::2218

本机IP.png

第一阶段

  • 使用wireshark抓包,打开https://www.bilibili.com/,待界面完全刷新后,停止抓包,结果如图。

    抓包截图.png

  • 点击第一条数据包,源地址为2001:250:4402:1119::2218即我的IP地址,目标地址为2408:8752:e00:600::5.

    展开tls字段,可以看到Content Type、Version、Length、Handshake Type等条目

    TLS.png

  • 点击第二条数据包,源地址为2408:8752:e00:600::5,目标地址为2001:250:4402:1119::2218

    展开tls字段,可以看到服务器回复了类似的字段

    TLS2.png

第二阶段

点开info为 Certificate, Server Key Exchange, Server Hello Done 的数据包,可以看到第二阶段发送了证书和服务器公钥

第二阶段.png

第三阶段

点开info为New Session Ticket, Change Cipher Spec, Encrypted Handshake Message的数据包,可以看到客户端进行第三阶段,客户端将证书验证后,生成本地随机密码,并发送给服务器,同时发送了客户端公钥,以及保证数据完整性的信息。

第三阶段0.png

第三阶段结束后开始传输数据包

可以看到发送了加密的数据包

第三阶段1.png
第三阶段2.png