什么是 SIP TLS?
SIP TLS(SIP over TLS)是使用传输层安全协议(Transport Layer Security)对 SIP 信令进行加密的传输方式。标准的 SIP 信令默认以明文形式通过 UDP/TCP 传输,这意味着网络上的任何人都可以通过抓包工具(如 Wireshark)读取 SIP 消息,包括呼叫方、被叫方、呼叫时间等敏感信息。
SIP over TLS 使用标准的 TLS 握手流程建立加密通道,确保 SIP 信令在传输过程中不被窃听或篡改。SIP TLS 默认使用端口 5061(而非标准 SIP 的 5060 端口),其规范定义于 RFC 3261 第 26 节。
SIP TLS 的核心功能
- 信令加密:加密所有 SIP 请求和响应消息,包括 INVITE、REGISTER、BYE 等
- 身份验证:通过 X.509 数字证书验证服务器身份,防止中间人攻击
- 完整性保护:使用 HMAC 消息认证码确保信令数据未被篡改
- 前向保密:使用 ECDHE 等密钥交换算法时,即使服务器私钥泄露,历史通话记录也无法被解密
TLS 握手流程(SIP 场景)
- SIP 客户端通过 TCP 连接到服务器的 5061 端口
- 客户端发送 ClientHello,包含支持的 TLS 版本和密码套件列表
- 服务器回复 ServerHello、数字证书和密钥交换参数
- 客户端验证服务器证书(检查 CA 链、有效期、域名匹配)
- 双方协商生成会话密钥(对称加密密钥)
- 后续所有 SIP 消息通过该加密通道传输
什么是 SRTP?
SRTP(Secure Real-time Transport Protocol,安全实时传输协议)是对 RTP 媒体流进行加密和认证的协议,定义于 RFC 3711。RTP 是 VoIP 通话中承载实际语音数据的协议,如果不对 RTP 进行加密,攻击者可以通过网络嗅探直接听到通话内容。
SRTP 在 RTP 的基础上增加了以下安全机制:
- 加密:使用 AES(Advanced Encryption Standard)对 RTP 载荷进行加密,支持 AES-CTR(计数器模式)和 AES-F8 模式
- 消息认证:使用 HMAC-SHA1 算法对 RTP 头部和载荷进行完整性校验,防止数据被篡改
- 重放保护:通过序号(ROC + SEQ)机制防止数据包被重放攻击
SRTP 加密开销
| 项目 | RTP(未加密) | SRTP(加密后) |
|---|---|---|
| 额外头部字节 | 0 | 4 字节(认证标签) |
| 加密延迟 | 0 | < 0.5ms |
| CPU 开销 | 低 | 低(AES-NI 硬件加速) |
| 带宽增加 | 0% | 约 0.5%-1% |
关键概念:SRTP 加密的是语音媒体流(即通话内容),而 SIP TLS 加密的是信令(即谁打给谁、呼叫控制命令)。两者互补,缺一不可,共同构成完整的 VoIP 安全方案。
TLS vs SRTP 的区别
很多初学者容易混淆 SIP TLS 和 SRTP,它们分别保护 VoIP 通信的不同层面。下表详细对比两者的差异:
| 对比项 | SIP TLS | SRTP |
|---|---|---|
| 保护对象 | SIP 信令 | RTP 媒体流 |
| 加密内容 | 呼叫控制消息(INVITE、BYE 等) | 语音数据(通话内容) |
| 默认端口 | 5061 | 无固定端口(动态协商) |
| 加密算法 | TLS 密码套件(AES-GCM、ChaCha20 等) | AES-CTR + HMAC-SHA1 |
| 密钥来源 | TLS 握手协商 | DTLS-SRTP 或 SDES 协商 |
| 防窃听内容 | 电话号码、呼叫时间、SDP 信息 | 语音/视频内容 |
| 防篡改 | 是(TLS MAC) | 是(HMAC-SHA1) |
| 定义标准 | RFC 3261 | RFC 3711 |
简单来说:TLS 保护"谁打给谁",SRTP 保护"说了什么"。完整的 VoIP 安全需要同时启用两者。
证书配置
SIP TLS 需要 X.509 数字证书来验证服务器身份。配置证书是启用 SIP TLS 的前提条件。
证书类型
| 证书类型 | 适用场景 | 成本 | 信任级别 |
|---|---|---|---|
| Let's Encrypt 免费证书 | 生产环境(推荐) | 免费 | 受信任 |
| 商业 SSL 证书 | 企业生产环境 | 付费 | 受信任 |
| 自签名证书 | 测试/开发环境 | 免费 | 不受信任(需手动信任) |
所需证书文件
- CA 证书(ca.crt):证书颁发机构的根证书,用于验证证书链
- 服务器证书(server.crt):包含服务器域名/IP 的数字证书
- 私钥(server.key):与证书配对的私钥文件,必须严格保密
使用 Let's Encrypt 获取证书
生成自签名证书(测试用)
密钥交换机制
SRTP 的加密密钥不会凭空产生,需要在通话建立过程中通过安全的方式协商。目前主流的 SRTP 密钥交换方式有两种:
1. DTLS-SRTP
DTLS-SRTP(Datagram Transport Layer Security for SRTP)是目前推荐的密钥交换方式,特别在 WebRTC 中是强制要求的。它通过 DTLS 握手在 RTP 通道上协商 SRTP 密钥,具有前向保密特性。
- 基于 UDP 的 TLS 握手,专为实时媒体设计
- 支持前向保密(Perfect Forward Secrecy)
- WebRTC 强制使用此方式
- 密钥在媒体通道上协商,与信令通道独立
2. SDES(SDP 安全描述)
SDES(Session Description Protocol Security Descriptions)通过 SIP 信令中的 SDP 传递 SRTP 密钥。虽然配置简单,但由于密钥通过信令通道传输,如果信令未加密(未启用 SIP TLS),密钥将暴露。
- 密钥在 SDP 的 crypto 属性中传递
- 配置简单,兼容性好
- 必须配合 SIP TLS 使用(否则密钥明文传输)
- 不支持前向保密
安全建议:优先使用 DTLS-SRTP。如果必须使用 SDES,务必同时启用 SIP TLS,否则 SRTP 密钥将在信令中以明文传输,形同虚设。
Asterisk 配置示例
以下是在 Asterisk 中启用 SIP TLS 和 SRTP 的配置步骤(基于 chan_sip 驱动):
sip.conf 配置
生成 Asterisk 证书
SRTP 配置
在 Asterisk 中,SRTP 通过在分机配置中设置 encryption=yes 来启用。Asterisk 会自动在 SDP 中协商 SRTP 加密参数。如果客户端支持 DTLS-SRTP,Asterisk 也会自动支持(需启用 dtlsenable=yes)。
FreeSWITCH 配置示例
以下是在 FreeSWITCH 中启用 SIP TLS 和 SRTP 的配置步骤:
SIP Profile 配置(internal.xml)
SRTP 强制模式
FreeSWITCH 证书配置
安全最佳实践
除了启用 SIP TLS 和 SRTP 外,以下安全措施也是保障 VoIP 系统安全的重要组成部分:
网络安全
- IP 白名单:在防火墙层面限制只允许已知的 SIP 对端 IP 地址访问 5060/5061 端口
- 关闭 SIP ALG:大多数路由器的 SIP ALG 功能存在 Bug,会破坏 SIP 信令,建议在路由器和防火墙上关闭
- 防火墙规则:仅开放必要端口(5061/TCP for SIP TLS,RTP 端口范围/UDP),关闭其他所有端口
- RTP 端口范围限制:配置固定的 RTP 端口范围(如 10000-20000/UDP),方便防火墙管理
证书管理
- 定期证书更新:Let's Encrypt 证书有效期 90 天,建议设置自动续签(cron job)
- 证书监控:设置证书过期告警,避免因证书过期导致 SIP TLS 连接失败
- 私钥保护:私钥文件权限设为 600,仅允许 asterisk/freeswitch 用户读取
协议安全
- 禁用弱密码套件:仅允许 TLS 1.2+,禁用 SSLv3、TLS 1.0/1.1
- 使用强密码套件:优先使用 AES-GCM、ECDHE 密钥交换
- 启用 SIP 摘要认证:防止未授权注册
- 禁用未加密传输:移除 UDP/TCP 传输,仅保留 TLS
监控与审计
- 记录所有 SIP 注册和呼叫尝试
- 监控 TLS 握手失败率(可能表示证书或配置问题)
- 定期检查 SRTP 加密统计(确保媒体流确实被加密)
- 实施呼叫频率限制,防止暴力破解和 Toll Fraud
常见问题
Q: SIP TLS 和 SRTP 是必须的吗?
A: 对于公网传输的 SIP 通话强烈建议启用。企业内网可选,但跨境通信和合规要求场景下必须启用。许多国家和地区的数据保护法规(如 GDPR、中国的数据安全法)要求对通信内容进行加密保护。
Q: 启用 TLS/SRTP 会影响通话质量吗?
A: 加密开销极小(< 1ms),对通话延迟和 MOS 几乎无影响。现代处理器都支持 AES-NI 硬件加速指令集,AES 加密/解密速度可达数 GB/s,远超语音通话所需的码率。SRTP 增加的带宽开销不到 1%。
Q: 如何获取 SIP TLS 证书?
A: 可使用 Let's Encrypt 免费证书、商业 SSL 证书或自签名证书。生产环境建议使用受信任 CA 签发的证书。Let's Encrypt 通过 DNS 验证即可为 SIP 域名签发证书,且支持自动续签。自签名证书仅适用于测试环境,因为对端需要手动信任。