当前位置: 首页 > news >正文

UCAS 24秋网络认证技术 CH10 SSL 复习

  1. TLS字段、参数含义
  2. 要了解每个消息是什么意思 基本方式只验证服务端,服务端有证书,变形方式加上验证客户端
  3. TLS1.3区别

协商过程

背景

Record层使用的各种加密算法参数,均由Handshake协议协商获得。

具体过程

  1. 随机数交换

    • Client/Server相互发送随机数(以明文形式)。
  2. 算法选择

    • 协商双方选择使用的加密算法。
  3. 公钥交换

    • Server发送自己的公钥证书。
    • Client验证该证书的有效性。
  4. 生成Premaster Secret

    • Client生成Premaster Secret,并用Server的公钥加密后发送给Server。
    • Server解密获取Premaster Secret。
  5. 密钥计算

    • 双方基于共享的Premaster Secret和随机数,使用约定的算法计算出:
      • W Key(工作密钥)
      • IV(初始化向量)
      • MAC_Secret(消息认证密钥)

1. TLS1.2交互过程

image.png

1. 简单过程(ClientHello 和 ServerHello)

  • ClientHello

    • 包含以下信息:

      • 支持的最高协议版本。
      • 32字节随机数(4字节时间 + 28字节随机数)。
      • Session ID(用于Session重用,可选)。
      • 支持的密码算法列表(cipher suites)。
    • 数据结构:

      struct {uint32 gmt_unix_time;opaque random_bytes[28];
      } Random;
      
  • ServerHello

    • 包含以下信息:

      • 同样的32字节随机数
      • 选定的协议版本和算法(cipher suite,单个)。
      • Session ID(同样可选)。
    • 数据结构:

      struct {ProtocolVersion server_version;Random random;SessionID session_id;CipherSuite cipher_suite;CompressionMethod compression_method;
      } ServerHello;
      

2. Server端发送证书及确认

image.png

  • Certificate

    • Server端发送证书链,包含从Server证书到信任链开始的完整链。
    • 包含Server的RSA公钥。
  • ServerHelloDone

    • Server端完成Hello阶段,等待Client的响应。

3. Client生成并发送密钥 (ClientKeyExchange)

image.png

  • Premaster Secret

    • Client根据ServerHello选择的密钥协商算法生成。

    • 生成的48字节Premaster Secret用Server证书公钥加密后发送。

    • 数据结构:

      struct {select (KeyExchangeAlgorithm) {case rsa: EncryptedPreMasterSecret;...} exchange_keys;
      } ClientKeyExchange;
      
  • 共享的秘密信息

    • 共有以下三部分:
      • 32字节Client.random(ClientHello)。
      • 32字节Server.random(ServerHello)。
      • 48字节Premaster Secret(秘密)。

4. 生成Master Secret

  • 基于Premaster Secret和随机数生成48字节Master Secret

  • 使用伪随机函数(PRF):

    master_secret = PRF(pre_master_secret, "master secret", ClientHello.random + ServerHello.random)[0..47];
    

5. 生成所需的密钥、IV、MAC Secret等

  • 基于Master Secret、Client Random和Server Random生成:

    • MAC Secret(消息认证密钥)。
    • 工作密钥(Write Key)
    • IV(初始化向量)。
  • PRF计算:

    key_block = PRF(SecurityParameters.master_secret, "key expansion", SecurityParameters.server_random + SecurityParameters.client_random);
    

6. ChangeCipherSpec & Finished

image.png

  • ChangeCipherSpec

    • 客户端和服务器分别切换到协商好的加密算法及密钥。
  • Finished

    • 双方发送验证消息,表明握手完成:

      verify_data = PRF(master_secret, finished_label, Hash(handshake_messages))[0..verify_data_length-1];
      

7. 最基本的Handshake协议流程总结

  • 步骤总结
    1. Client → Server:ClientHello。
    2. Server → Client:ServerHello, Certificate, ServerHelloDone。
    3. Client → Server:ClientKeyExchange, [ChangeCipherSpec], Finished。
    4. Server → Client:[ChangeCipherSpec], Finished。
    5. 双方进入Application Data阶段。

基本变形1 - Client鉴别

image.png image.png

变形1:Client鉴别
  • 基本背景
    • 默认情况下,Client会利用Server证书对Server进行鉴别。
    • 在支持双向认证的场景中,Server可以对Client进行鉴别。

流程

  1. Server向Client请求证书
    • 在发送完Server证书之后,Server发送CertificateRequest消息

    • CertificateRequest中列出了Server接收的Client证书要求,包括:

      • 算法(如RSA、DSS等)。
      • 受信任的CA名称。
    • 数据结构:

      struct {ClientCertificateType certificate_types<1..2^8-1>;SignatureAndHashAlgorithm supported_signature_algorithms<2^16-1>;DistinguishedName certificate_authorities<0..2^16-1>;
      } CertificateRequest;
      

  1. Client响应
    • Client需要回复CertificateCertificateVerify消息:
      • Certificate消息:包含Client的证书链,证明自己的身份。

        struct {ASN.1Cert certificate_list<0..2^24-1>;
        } Certificate;
        
      • CertificateVerify消息

        • 对所有之前的Handshake消息进行数字签名(从ClientHello到当前消息,不包括本消息)。
        • 用于证明Client对所发送消息的完整性及其身份的真实性。
        struct {digitally-signed struct {opaque handshake_messages[handshake_messages_length];};
        } CertificateVerify;
        

  1. 验证流程
    • Server验证Client提交的证书是否可信,是否满足其在CertificateRequest中的要求。
    • 确认Client身份后,完成后续Handshake过程。

总结

  • 双向认证的场景主要通过Server对Client的证书请求与验证实现。
  • Client通过CertificateVerify消息提供对其身份及Handshake消息的数字签名,确保其认证信息的真实性和完整性。

变形2 - 不同类型证书/算法的影响

image.png image.png

1. ClientHello

  • Client → Server:发送ClientHello消息。
    • 包含随机数 (R_C)。
    • 支持的协议版本、加密算法、压缩方法等信息。

2. ServerHello

  • Server → Client:发送ServerHello消息。
    • 包含随机数 (R_S)。
    • 确定的协议版本、加密算法、Session ID。

3. Server发送附加消息

  • Server根据需要发送以下消息:
    • Certificate (可选):发送Server证书链。
    • ServerKeyExchange (可选):在非RSA加密时发送,包含密钥交换所需的信息。
    • CertificateRequest (可选):请求Client提供证书(用于双向认证)。
    • ServerHelloDone:表明Server完成Hello阶段,等待Client响应。

4. Client发送响应消息

  • Certificate (可选):发送Client证书,用于证明其身份(双向认证)。
  • ClientKeyExchange:发送密钥交换信息(例如,Premaster Secret加密数据)。
  • CertificateVerify (可选):对之前的Handshake消息进行签名,用于验证Client身份。

5. ChangeCipherSpec & Finished

  • Client → Server
    • ChangeCipherSpec:通知切换到加密通信。
    • Finished:发送加密的验证消息,表明握手完成。
  • Server → Client
    • ChangeCipherSpec:通知切换到加密通信。
    • Finished:发送加密的验证消息,表明握手完成。

6. 加密的Application Data阶段

  • 双方开始加密通信,传输实际的应用数据。
  • 所有后续数据都受到握手中协商的加密算法和密钥的保护。

重要说明

  • 带星号 (*) 的步骤为可选。
  • ChangeCipherSpecFinished标志着切换到加密通信阶段。
  • 握手完成后,所有通信均加密。

变形3 - Session重用

image.png

Session重用的背景
  • Session重用机制旨在提高TLS协议的效率,避免重新协商所有参数。
  • 使用Session ID来标识和重用之前的会话。

1. 第一次协商会话

  • 在首次TLS握手协商时:
    • ServerHello中会给出一个Session ID
    • 如果Server不想支持Session重用,则不会提供Session ID。
    • 双方完成会话协商后,传输一定的Application Data后,断开连接。

2. 第二次会话中Client发起重用

  • ClientHello
    • 在第二次会话中,Client在ClientHello中携带上次的Session ID,表示希望重用Session。
    • 如果Client不希望重用Session,则在ClientHello中不提供Session ID。

3. Server处理Client的重用请求

  • ServerHello
    • Server接收到带有Session ID的ClientHello后,会查找自己的缓存:
      • 如果找到与该Session ID对应的Session,并且Server允许重用:
        • 在返回的ServerHello中携带相同的Session ID,表示同意重用。
        • 跳过完整握手过程,直接切换到加密算法,通过发送ChangeCipherSpecFinished消息完成重用过程。
      • 如果未找到或不允许重用:
        • Server返回一个新的Session ID,表示重新协商。

Session重用过程的关键点

  1. Client的请求

    • ClientHello中明确是否希望重用Session。
  2. Server的处理

    • 通过Session ID查询缓存,并决定是否接受重用请求。
  3. 效率提升

    • 如果允许重用,跳过复杂的握手过程,直接切换到加密传输阶段。

2. TLS1.3的区别

image.png image.png image.png image.png image.png image.png image.png

http://www.lryc.cn/news/516183.html

相关文章:

  • 【linux内核分析-存储】EXT4源码分析之“文件删除”原理【七万字超长合并版】(源码+关键细节分析)
  • 代码随想录 day62 第十一章 图论part11
  • springboot571基于协同过滤算法的私人诊所管理系统(论文+源码)_kaic
  • Uniapp Android 本地离线打包(详细流程)
  • vite+vue3动态引入资源文件(问题已解决但离了个大谱)
  • 通过 4 种方式快速将音乐从 iPod 传输到 Android
  • ArcGIS中怎么把数据提取到指定范围(裁剪、掩膜提取)
  • 【Vaadin flow 实战】第3讲-快速上手构建VaadinFlow+Springboot的全栈web项目
  • HBase Cassandra的部署和操作
  • 用户界面软件01
  • 【云原生】Docker Compose 从入门到实战使用详解
  • 【ShuQiHere】使用 SCP 进行安全文件传输
  • 海康威视H5player问题汇总大全
  • 力扣23.合并K个升序链表
  • 【C 语言指针篇】指针的灵动舞步与内存的神秘疆域:于 C 编程世界中领略指针艺术的奇幻华章
  • 游戏关卡设计的常用模式
  • 在一台服务器上使用docker运行kafka集群
  • Apache Celeborn 在B站的生产实践
  • JOIN 和 OUTER JOIN,SQL中常见的连接方式
  • Vue2: table加载树形数据的踩坑记录
  • 电子信息硕士面试经验
  • dns网址和ip是一一对应的吗?
  • springboot3 redis 常用操作工具类
  • Java工程师实现视频文件上传minio文件系统存储及网页实现分批加载视频播放
  • Redis(二)value 的五种常见数据类型简述
  • Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决
  • 【网页自动化】篡改猴入门教程
  • 【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 4:MHE表示能力
  • Github - unexpected disconnect while reading sideband packet
  • Ubuntu 环境安装 之 RabbitMQ 快速入手