什么是 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 场景)

  1. SIP 客户端通过 TCP 连接到服务器的 5061 端口
  2. 客户端发送 ClientHello,包含支持的 TLS 版本和密码套件列表
  3. 服务器回复 ServerHello、数字证书和密钥交换参数
  4. 客户端验证服务器证书(检查 CA 链、有效期、域名匹配)
  5. 双方协商生成会话密钥(对称加密密钥)
  6. 后续所有 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(加密后)
额外头部字节04 字节(认证标签)
加密延迟0< 0.5ms
CPU 开销低(AES-NI 硬件加速)
带宽增加0%约 0.5%-1%

关键概念:SRTP 加密的是语音媒体流(即通话内容),而 SIP TLS 加密的是信令(即谁打给谁、呼叫控制命令)。两者互补,缺一不可,共同构成完整的 VoIP 安全方案。

TLS vs SRTP 的区别

很多初学者容易混淆 SIP TLS 和 SRTP,它们分别保护 VoIP 通信的不同层面。下表详细对比两者的差异:

对比项SIP TLSSRTP
保护对象SIP 信令RTP 媒体流
加密内容呼叫控制消息(INVITE、BYE 等)语音数据(通话内容)
默认端口5061无固定端口(动态协商)
加密算法TLS 密码套件(AES-GCM、ChaCha20 等)AES-CTR + HMAC-SHA1
密钥来源TLS 握手协商DTLS-SRTP 或 SDES 协商
防窃听内容电话号码、呼叫时间、SDP 信息语音/视频内容
防篡改是(TLS MAC)是(HMAC-SHA1)
定义标准RFC 3261RFC 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 获取证书

# 安装 certbot sudo apt install certbot # 使用 DNS 验证获取通配符证书(推荐,因为 SIP 服务器可能无公网 HTTP) sudo certbot certonly --manual --preferred-challenges dns -d sip.example.com # 证书文件路径 # 证书: /etc/letsencrypt/live/sip.example.com/fullchain.pem # 私钥: /etc/letsencrypt/live/sip.example.com/privkey.pem

生成自签名证书(测试用)

# 生成私钥和自签名证书(有效期 365 天) openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt \ -days 365 -nodes -subj "/CN=sip.example.com"

密钥交换机制

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 配置

[general] ; 启用 TLS tlsenable=yes tlsbindaddr=0.0.0.0:5061 tlscertfile=/etc/asterisk/keys/server.crt tlsprivatekey=/etc/asterisk/keys/server.key tlscafile=/etc/asterisk/keys/ca.crt tlscipher=HIGH:-aRSA:-SHA384:-SHA256 tlsclientmethod=tlsv1_2 ; SIP 分机配置(启用加密) [1001] type=friend host=dynamic secret=YourStrongPassword context=internal dtlsenable=yes dtlsautohandshake=yes encryption=yes transport=tls,wss

生成 Asterisk 证书

# 使用 Asterisk 内置脚本生成证书 cd /usr/src/asterisk/contrib/scripts/ ./ast_tls_cert -C sip.example.com -O "My Company" \ -d /etc/asterisk/keys

SRTP 配置

在 Asterisk 中,SRTP 通过在分机配置中设置 encryption=yes 来启用。Asterisk 会自动在 SDP 中协商 SRTP 加密参数。如果客户端支持 DTLS-SRTP,Asterisk 也会自动支持(需启用 dtlsenable=yes)。

FreeSWITCH 配置示例

以下是在 FreeSWITCH 中启用 SIP TLS 和 SRTP 的配置步骤:

SIP Profile 配置(internal.xml)

<profile name="internal"> <!-- TLS 配置 --> <param name="tls" value="true"/> <param name="tls-bind-params" value="transport=tls"/> <param name="tls-sip-port" value="5061"/> <param name="tls-cert-dir" value="/etc/freeswitch/tls/"/> <param name="tls-version" value="tlsv1.2"/> <!-- SRTP 配置 --> <param name="rtp-ip" value="$${local_ip_v4}"/> <param name="sip-ip" value="$${local_ip_v4}"/> <param name="apply-nat-acl" value="rfc1918.auto"/> <param name="ext-rtp-ip" value="$${external_rtp_ip}"/> <param name="ext-sip-ip" value="$${external_sip_ip}"/> </profile>

SRTP 强制模式

<!-- 在 dialplan 中强制 SRTP --> <extension name="force_srtp"> <condition field="destination_number" expression="^(.*)$"> <action application="set" data="rtp_secure_media=true"/> <action application="set" data="rtp_secure_media_outbound=true"/> <action application="bridge" data="sofia/internal/$1@destination"/> </condition> </extension>

FreeSWITCH 证书配置

# 将证书复制到 FreeSWITCH TLS 目录 cp fullchain.pem /etc/freeswitch/tls/agent.pem cp privkey.pem /etc/freeswitch/tls/agent.key # 确保权限正确 chown freeswitch:freeswitch /etc/freeswitch/tls/* chmod 600 /etc/freeswitch/tls/agent.key

安全最佳实践

除了启用 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 域名签发证书,且支持自动续签。自签名证书仅适用于测试环境,因为对端需要手动信任。

需要安全的国际语音线路?

菜鸟语音提供全链路 TLS + SRTP 加密的 SIP 中继服务,覆盖 200+ 国家

免费咨询