4、SIP传输层安全审计:TLS/DTLS配置审计

传输层安全,说白了就是给SIP通话加一把锁。我见过太多企业,SIP服务器裸奔在公网上,信令明文传输,抓个包就能听到老板在电话里骂人。嗯,这节我们就来聊聊怎么审计这把锁够不够牢。

4.1 TLS/DTLS版本与密码套件审计

先说说TLS版本。我个人习惯,低于TLS 1.2的直接判不合格。为什么?TLS 1.0和1.1已经被RFC 8996正式废弃了,你还在用,等于告诉黑客「欢迎来搞」。

⚠️ 注意: 我在项目中遇到过一家客户,SIP网关配置了TLS 1.0,结果被扫描出CVE-2014-3566(POODLE攻击)。他们当时还嘴硬说「用了这么多年都没事」——直到我演示了如何用openssl s_client轻松解密他们的信令。

密码套件这块,我建议你记住一个原则:用AEAD,别用CBC。AEAD模式(比如GCM)同时提供加密和完整性校验,而CBC模式容易受到padding oracle攻击。

下面是我常用的审计检查清单:

  • 版本要求: 仅允许TLS 1.2和TLS 1.3,禁用SSLv3、TLS 1.0、TLS 1.1
  • 密码套件: 优先使用TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256或更强的套件
  • 禁用项: 所有RC4、DES、3DES、CBC模式套件必须禁用
  • 密钥交换: 禁用静态RSA密钥交换,必须使用DHE或ECDHE(前向安全性)
🔍 审计命令示例:
# 检查SIP服务器支持的TLS版本和密码套件
openssl s_client -connect sip.example.com:5061 -tls1_2 -cipher 'ECDHE+AESGCM' -msg

# 扫描弱密码套件
nmap --script ssl-enum-ciphers -p 5061 sip.example.com

你想想看,如果密码套件里还留着TLS_RSA_WITH_AES_128_CBC_SHA,那你的SIP信令基本上就是明文——只是多了层薄薄的伪装。

4.2 SIPS URI强制审计

SIPS URI,就是sips:user@domain这种格式。它和sip:的区别在于,SIPS强制要求整个信令路径都使用TLS加密。但这里有个坑:SIPS只保证传输层加密,不保证端到端

我曾经审计过一个VoIP平台,他们的配置里写了SIPS URI,但实际测试发现——中间某个代理节点降级成了普通SIP。为什么会这样?因为SIPS的强制特性依赖于每个hop都正确实现,只要有一个节点不支持,就会静默降级。

审计要点:

  1. 检查UA配置: 确认所有用户代理的Contact头、Route头都使用sips: URI
  2. 检查服务器配置: 确认代理服务器和注册服务器强制要求SIPS,拒绝普通SIP请求
  3. 检查路由表: 确认DNS SRV记录中_tls服务优先级高于_tcp
  4. 抓包验证: 实际抓包确认所有SIP消息都在TLS隧道内传输
💡 小技巧: 我习惯在SIP服务器上配置一个策略:如果收到普通sip: URI的请求,直接返回403 Forbidden。这样能强制所有客户端升级到SIPS。

4.3 传输层加密强度评估

加密强度评估,说白了就是看看你的TLS配置到底有多硬。我一般从三个维度来打分:

评估维度 优秀(3分) 合格(2分) 不合格(0分)
TLS版本 仅TLS 1.3 TLS 1.2 + 1.3 包含TLS 1.1或更低
密钥长度 ≥256位对称密钥 128位对称密钥 <128位或使用RC4
前向安全性 仅ECDHE 支持DHE/ECDHE 使用静态RSA
证书强度 ECDSA P-384或RSA 4096 RSA 2048 RSA 1024或自签名

总分低于6分的,我建议直接拉警报。我记得有一次审计,发现某运营商的SIP中继居然还在用512位的RSA证书——这玩意儿用普通笔记本几分钟就能破解。

4.4 中间人攻击防护审计

中间人攻击(MITM)是SIP传输层最大的威胁之一。攻击者可以拦截TLS握手,降级密码套件,甚至伪造证书。怎么防?我总结了三道防线:

第一道防线:证书验证

很多SIP客户端默认不验证服务器证书!这是个致命问题。我建议你检查:

  • 客户端是否配置了CA证书链
  • 是否启用了主机名校验(CN/SAN匹配)
  • 证书吊销检查(CRL或OCSP)是否开启

第二道防线:证书固定(Certificate Pinning)

对于内部SIP系统,我强烈建议做证书固定。把服务器证书的公钥哈希值硬编码到客户端配置里,这样即使CA被攻破,攻击者也无法伪造。

🔐 证书固定配置示例(OpenSIPS):
# 在opensips.cfg中配置
modparam("tls_mgm", "certificate", "/etc/opensips/tls/server.crt")
modparam("tls_mgm", "private_key", "/etc/opensips/tls/server.key")
modparam("tls_mgm", "ca_list", "/etc/opensips/tls/ca.crt")
# 启用证书验证
modparam("tls_mgm", "verify_cert", "1")
modparam("tls_mgm", "require_cert", "1")

第三道防线:DTLS-SRTP

对于媒体流(RTP),我建议使用DTLS-SRTP。它能在UDP上提供类似TLS的保护,而且支持SRTP密钥协商。我在一个金融客户的项目里部署了DTLS-SRTP,成功拦截了一次针对媒体流的MITM攻击——攻击者抓到的RTP包全是乱码。

⚠️ 避坑指南: 我曾经遇到一个案例,客户同时开启了TLS和DTLS,但没配置正确的密码套件优先级。结果攻击者通过发送恶意的DTLS ClientHello,迫使服务器降级到空加密套件(TLS_NULL_WITH_NULL_NULL)。嗯,这相当于把门锁拆了。解决方案:在配置中显式禁用空密码套件,并设置严格的密码套件白名单。

4.5 知识体系总览

下面这张图,是我梳理的SIP传输层安全审计的核心逻辑。你可以把它当作检查清单来用:

SIP传输层安全审计框架 TLS/DTLS版本与密码套件 版本 ≥ TLS 1.2 | AEAD密码套件 | 禁用CBC/RC4 SIPS URI强制审计 强制sips: URI | 拒绝普通sip: | 路由验证 加密强度评估 密钥长度 | 前向安全性 | 证书强度 中间人攻击防护 证书验证 | 证书固定 | DTLS-SRTP 目标:确保SIP信令和媒体流全程加密,抵御窃听和篡改 审计输出:安全评分 + 整改建议

这张图的核心思路是:从四个维度分别审计,最后汇总成一个安全评分和整改建议清单。我在实际项目中,通常会给每个维度打分,然后加权平均。低于70分的,必须整改后才能上线。

好了,传输层安全审计就聊到这里。记住一句话:SIP安全不是配了TLS就完事了,你得确保每个环节都锁死。下一节我们会聊SIP身份认证安全审计,到时候见。