在 WebRTC 中的作用

DTLS(Datagram Transport Layer Security)是 TLS 的 UDP 版本,在 WebRTC 中用于:

  • 安全协商加密密钥
  • 对等验证(基于 X.509 证书 + fingerprint)
  • 为 SRTP/SRTCP 提供密钥材料

WebRTC 不直接用 DTLS 传输音视频,而是通过它协商出密钥后,用于 SRTP/SRTCP 加密 RTP/RTCP 流。

与 SRTP 的关系

在 WebRTC 中,音视频数据加密流程如下:

[RTP/RTCP] ─► SRTP/SRTCP ─► UDP Socket▲Key 来源于 DTLS
  • DTLS:协商密钥(SDES 替代方案)
  • SRTP:使用 DTLS 派生出的密钥加密 RTP
  • SRTCP:同理用于 RTCP 加密

DTLS 本质上是提供 密钥协商、身份认证、消息完整性保护

握手流程详解

流程图

Client                  Server| ------ ClientHello ------> || <--- HelloVerifyRequest -- || ------ ClientHello ------> |  (带 cookie)| <-------- ServerHello -----|| <----- Certificate --------|| <- ServerKeyExchange (可选)| <- CertificateRequest (可选)| <---- ServerHelloDone -----|| ---- Certificate (可选) -->|| ---- ClientKeyExchange --> || ---- CertificateVerify --> || ---- ChangeCipherSpec -->  || ---- Finished -----------> || <--- ChangeCipherSpec ---- || <-------- Finished --------|

ClientHello(第一次)

客户端发起握手,发送:

  • 协议版本(如 DTLS 1.2)
  • 随机数(Random)
  • 支持的加密套件(cipher suites)
  • 会话 ID(Session ID)
  • 扩展(如 SNI)

HelloVerifyRequest(服务器防攻击措施)

  • 目的:防止 DoS 攻击(攻击者伪造 IP,消耗服务器资源)
  • 内容:服务端返回一个 cookie 给客户端,要求客户端再发送一次 ClientHello 并带上这个 cookie
  • 此时没有任何状态被保留(无状态机制)

ClientHello(第二次,带 Cookie)

  • 客户端重新发起 ClientHello,并附上 cookie
  • 服务端验证 cookie 成功后,进入真正的握手过程

ServerHello

  • 服务端选择协议版本、加密算法
  • 提供其 Random、Session ID、压缩方法、扩展信息

Certificate(服务端证书)

  • 服务端发送其证书(如 X.509),用于客户端验证其身份

ServerKeyExchange(可选)

  • 如果所选加密套件是临时密钥交换(如 ECDHE),会发送这个报文,包含公钥参数等

CertificateRequest(可选)

  • 如果需要客户端身份认证,服务端请求客户端提供证书

ServerHelloDone

  • 服务端完成所有 hello 消息,提示客户端可以继续下一步

Certificate(客户端,若服务端请求)

  • 客户端发送证书用于身份认证(如 Mutual TLS)

ClientKeyExchange

  • 客户端发送密钥交换材料(如 DH 公钥、RSA 加密的 pre-master secret)

CertificateVerify(可选)

  • 如果客户端提供了证书,此报文包含对前面握手消息的签名,用于验证客户端拥有私钥

ChangeCipherSpec

  • 客户端通知服务端:接下来所有数据都将使用协商好的加密套件加密

Finished

  • 客户端发送已加密的 Finished 消息,包含所有握手摘要的摘要(验证握手完整性)

服务端 ChangeCipherSpec + Finished

  • 服务端也切换加密,并发送加密的 Finished 消息

特有的机制

特性说明
消息序列号(Message Sequence)每条握手消息都有编号,用于乱序重组
重传机制如果对方没有应答,会重传握手消息(无 ACK)
记录层编号(Epoch/Sequence Number)每个阶段有不同的 epochseq,用于包重放保护
HelloVerifyRequest防止 IP 伪造攻击,DTLS 专属机制

重传机制(Retransmission)

  • 为什么需要?
    UDP 不保证报文到达和顺序,DTLS 握手报文可能丢失,必须实现重传保证握手完成。
  • 机制内容:
    • DTLS 对握手消息做序列号标记;
    • 如果客户端或服务器在超时时间内未收到预期消息,会重传之前的握手消息;
    • 重传报文必须被对端识别为重复消息并正确处理,不导致状态错误。

消息序列号(Message Sequence Number)

  • 用途:
    防止握手消息乱序,保证握手阶段状态同步。
  • 特点:
    • 每个握手消息分配序列号,递增;
    • 接收端按序列号处理消息,忽略重复或乱序消息。

握手消息片段化(Fragmentation)

  • 为什么需要?
    UDP 报文大小有限,握手消息可能大于单个 UDP 报文大小。
  • 机制内容:
    • 握手消息可以被分割成多个片段(Fragment)发送;
    • 接收端负责重组片段,直到完整消息;
    • 每个片段带有片段偏移和长度信息。

Cookie 机制(HelloVerifyRequest)

  • 目的:
    防止DoS 攻击(反射放大攻击),避免服务器资源被恶意请求耗尽。
  • 流程:
    • 客户端第一次发送 ClientHello,服务器不直接响应握手,而是回复一个带有 Cookie 的 HelloVerifyRequest
    • 客户端必须带上该 Cookie 重新发送 ClientHello
    • 服务器验证 Cookie 合法后才继续握手流程。

序列号和重放保护(Replay Protection)

  • 内容:
    • DTLS 为每条记录分配序列号(Record Sequence Number),确保记录不会被重放;
    • 接收端检测重复序列号,丢弃重放包;
    • 与 TLS 不同的是,DTLS 要在无连接环境下实现此功能。

无连接的记录层(Record Layer)

  • DTLS 使用和 TLS 类似的记录层结构,但消息通过 UDP 发送,没有连接状态;
  • 每条记录带有协议版本、内容类型、长度和序列号字段。

时间戳和定时器

  • DTLS 需要在握手时设置超时定时器,管理重传和超时处理;
  • 这在 TLS(基于 TCP)中不需要,因为 TCP 已经保证了可靠传输。

支持 MTU 探测与路径 MTU 发现

  • 由于 UDP 报文大小限制,DTLS 可以基于握手分片检测 MTU,以防止 IP 层分片导致性能下降。

Fingerprint(证书指纹)

DTLS Fingerprint 是对参与 DTLS 握手的 X.509 证书进行哈希计算(例如 SHA-256),生成的一串唯一字符串。

WebRTC 中不会使用 CA 机构来验证证书,而是通过交换证书指纹(fingerprint)来验证对等端。

  • SDP 协商中携带 fingerprint
  • 格式示例:
a=fingerprint:sha-256 7F:B8:33:...:9D

验证流程:

  1. 浏览器生成 DTLS 证书(X.509);
  2. 提取 fingerprint,加入 SDP;
  3. 对端在接收 DTLS 握手证书时,校验是否与 fingerprint 匹配;
  4. 若不匹配,则拒绝连接。

这确保了对端身份未被中间人篡改。

OpenSSL DTLS

#include <openssl/ssl.h>
#include <openssl/err.h>SSL_CTX *init_dtls_server_ctx() {const SSL_METHOD *method = DTLS_server_method();SSL_CTX *ctx = SSL_CTX_new(method);// 加载服务器证书和私钥SSL_CTX_use_certificate_file(ctx, "server_cert.pem", SSL_FILETYPE_PEM);SSL_CTX_use_PrivateKey_file(ctx, "server_key.pem", SSL_FILETYPE_PEM);// 设置握手重传超时和最大重试次数// DTLS 有内置超时机制,OpenSSL自动处理重传// 不用手动实现重传逻辑return ctx;
}void dtls_handshake(SSL *ssl, BIO *bio) {// 设置BIO为无连接UDP模式SSL_set_bio(ssl, bio, bio);// 阻塞握手直到成功或失败int ret = SSL_accept(ssl);if (ret <= 0) {int err = SSL_get_error(ssl, ret);if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) {// 需要继续读写,可能是等待重传// 事件循环继续} else {// 握手失败处理}}// 握手成功后,调用SSL_read/SSL_write进行加密数据收发
}

DTLS 与 TLS 的关键区别

项目TLSDTLS
传输层TCPUDP
顺序有序无序
重传不需要需要(自实现)
报文格式流式数据报(data-gram)
拒绝服务防护有 HelloVerifyRequest
应用场景HTTPSWebRTC / VoIP / SRTP / IoT

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86709.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86709.shtml
英文地址,请注明出处:http://en.pswp.cn/web/86709.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北大肖臻《区块链技术与应用》学习笔记

区块链学习笔记 \huge{区块链学习笔记} 区块链学习笔记 这是关于北京大学肖臻老师的《区块链技术与应用》课程的学习笔记。 BTC的数据结构 hash pointers&#xff1a;既保存结构体的对应地址位置&#xff08;指针&#xff09;&#xff0c;又保存结构体对应映射的hash值&#…

MongoDB 驱动升级性能测试报告

测试背景 将 MongoDB Java 驱动从 4.11.5 升级至 5.5.1&#xff0c;并配合 Reactor Core 3.8.0-M4 进行性能对比测试。测试主要围绕插入、查询、更新和删除四个核心操作进行。 环境配置 操作系统: Windows 11CPU: Intel Core™ i7-14700F, 28 核心, 2.10 GHzJDK: OpenJDK 21.…

淘宝商品评论实时采集 API 接入指南:从零开始实战开发

在电商数据分析领域&#xff0c;商品评论数据蕴含着用户对产品的真实反馈&#xff0c;对商家优化产品、提升服务质量具有重要价值。本文将详细介绍如何接入淘宝 API&#xff0c;实现商品评论的实时采集&#xff0c;从环境搭建到代码实现进行全流程讲解。 1. 淘宝api概述 淘宝…

ffpaly播放 g711a音频命令

ffpaly播放 g711a音频命令 ffplay 播放 G.711 A-law (8kHz, mono, 16bit) 音频的命令&#xff1a; ffplay -f alaw -ar 8000 -ac 1 input.g711a 或ffplay -f alaw -ar 8000 -ac 1 audio_chn0.g711a 各参数说明&#xff1a; -f alaw&#xff1a;指定输入音频格式为 G.711 A-law…

composer全局配置

composer配置 composer查看全局配置 composer config -l -gcomposer 更新慢 composer下载不下来问题解决 更换composer镜像源&#xff0c;可以执行尝试以下几种&#xff1a; 1、更换成阿里镜像&#xff1a; composer config -g repo.packagist composer https://mirrors.al…

ivx创建一个测试小案例

文章目录 前端后端提交信息服务提交信息事件跳转列表页事件下载事件详情页事件 https://editor.ivx.cn/ 主题选择一下 前端 在前台新建一个页面名为提交页&#xff0c;内边距左和内边距右都设置为40&#xff0c;水平居中和垂直居中设置一下&#xff1b; 新建两个输入框&#x…

【MongoDB】MongoDB从零开始详细教程 核心概念与原理 环境搭建 基础操作

MongoDB从零开始详细教程 核心概念与原理 环境搭建 基础操作 一、核心概念与原理1. 核心组件2. MongoDB vs 关系型数据库 二、环境搭建&#xff08;Windows/Linux/CentOS&#xff09;1. Windows安装2. CentOS安装3. 连接验证 三、基础操作&#xff08;CRUD&#xff09;1. 数据库…

GeoTools 结合 OpenLayers 实现属性查询

前言 在GIS开发中&#xff0c;属性查询是非常普遍的操作&#xff0c;这是每一个GISer都要掌握的必备技能。实现高效的数据查询功能可以提升用户体验&#xff0c;完成数据的快速可视化表达。 本篇教程在之前一系列文章的基础上讲解如何将使用GeoTools工具结合OpenLayers实现Post…

vue-27(实践练习:将现有组件重构为使用组合式 API)

实践练习:将现有组件重构为使用组合式 API 理解重构过程 重构是任何开发者的关键技能,尤其是在采用新范式如 Vue.js 中的 Composition API 时。它涉及在不改变外部行为的情况下重新组织现有代码,旨在提高可读性、可维护性和可重用性。在从 Options API 迁移到 Composition…

基于Uniapp+SpringBoot+Vue 的在线商城小程序

开发系统:Windows10 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,jquery,html,vue 角色:用户 商家 管理员 用户菜单:首页:商…

华为云Flexus+DeepSeek征文|利用华为云一键部署的Dify平台构建高效智能电商客服系统实战

目录 前言 1 华为云快速搭建 Dify-LLM 应用平台 1.1 一键部署简介 1.2 设置管理员账号登录dify平台 2 接入 DeepSeek 大模型与 Reranker 模型 2.1 接入自定义 LLM 模型 2.2 设置 Reranker 模型 3 构建电商知识库 3.1 数据源选择 3.2 分段设置与清洗 3.3 处理并完成 …

python应用day07---pyechars模块详解

1.pyecharts安装: pip install pyecharts 2.pyecharts入门: # 1.导入模块 from pyecharts.charts import Line# 2.创建Line对象 line Line() # 添加数据 line.add_xaxis(["中国", "美国", "印度"]) line.add_yaxis("GDP数据", [30…

高档背景色

https://andi.cn/page/622250.html

教学视频画中画播放(PICTURE-IN-PICTURE)效果

视频平台的画中画&#xff08;PIP&#xff09;功能通过小窗播放提升用户体验&#xff1a;1&#xff09;支持多任务处理&#xff0c;如边看教程边操作文档&#xff1b;2&#xff09;减少应用跳出率&#xff0c;增强用户粘性&#xff1b;3&#xff09;优化屏幕空间利用&#xff1…

MySQL (一):数据类型,完整性约束和表间关系

在当今数据驱动的时代&#xff0c;数据库作为数据存储与管理的核心工具&#xff0c;其重要性不言而喻。MySQL 作为一款广泛应用的开源数据库&#xff0c;凭借其高性能、高可靠性和丰富的功能&#xff0c;深受开发者喜爱。本文作为 MySQL 系列博客的开篇&#xff0c;将带你深入了…

【软考高项论文】信息系统项目的资源管理

摘要 本文围绕信息系统项目的资源管理展开论述。首先阐述了项目资源管理的基本过程&#xff0c;包括资源规划、估算、获取、配置、监控和释放等关键步骤&#xff0c;并给出资源分解结构示例。接着结合2024年参与管理的某信息系统项目实际情况&#xff0c;详细说明资源管理的具…

阿里云Ubuntu服务器上安装MySQL并配置远程连接

1. 安装MySQL 首先连接到你的Ubuntu服务器&#xff0c;然后执行&#xff1a; # 更新软件包列表 sudo apt update# 安装MySQL服务器 sudo apt install mysql-server# 启动MySQL服务 sudo systemctl start mysql# 设置MySQL开机自启 sudo systemctl enable mysql# 检查MySQL状态…

STM32HAL 旋转编码器教程

配置时钟编码模式读取方法&#xff1a; if(__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim1) 0){count - __HAL_TIM_GET_COUNTER(&htim1);}else{count __HAL_TIM_GET_COUNTER(&htim1);}bsp_dtUInt32_show(count);__HAL_TIM_SET_COUNTER(&htim1, 0); 通过 __HAL_TIM…

激光束修复手机屏任意层不良区域,实现液晶线路激光修复原理

摘要 手机屏结构多层复合&#xff0c;任意层线路不良严重影响显示质量。激光束凭借高能量密度与可调控性&#xff0c;能够穿透不同介质精准作用于目标层。本文基于激光与多层材料相互作用机制&#xff0c;解析激光束对手机屏各层不良区域的修复原理&#xff0c;为全层液晶线路…

【软件开发】架构与架构师

文章目录 一、前言二、关于系统架构1. 保障用户访问速度2. 支持大规模并发请求3. 应对复杂业务逻辑4. 应对海量数据的存储与读写三、关于系统架构师四、关于安全架构1. 产品安全架构2. 安全体系架构五、关于安全架构师一、前言 在系统建设与技术架构实践不断推进的背景下,关于…