Asterisk+GNS3环境SRTP加密失效求助:TLS正常媒体未加密
排查Asterisk SRTP强制加密不生效的问题
结合你描述的现象(TLS信令正常,但SRTP媒体加密未生效,仍能发起UDP未加密通话),我整理了几个关键的排查方向和解决步骤:
1. 先确认软电话的核心配置是否正确
你提到软电话配置了加密,但很可能是以下两个点没设置到位:
- 传输方式与端口:确保Blink账号的传输类型选的是TLS,端口设置为Asterisk的TLS端口(默认5061),而不是UDP 5060。如果软电话用UDP连接信令,即使你在endpoint里配置了SRTP,媒体也会默认走UDP未加密。
- 媒体加密强制开关:在Blink的媒体设置里,把SRTP加密从“自动”或“可选”改成**“强制启用”**。很多软电话默认是协商模式,如果加密协商失败会 fallback 到未加密,这就会出现你遇到的情况。
2. 验证Asterisk的Transport配置
你的endpoint指定了transport=0.0.0.0-tls,但要确认这个Transport的配置是否正确(位于pjsip.transports.conf):
[0.0.0.0-tls] type=transport protocol=tls bind=0.0.0.0:5061 cert_file=/path/to/your/certificate.pem priv_key_file=/path/to/your/privatekey.pem ca_list_file=/path/to/your/ca.pem
重点检查:
protocol必须是tls,不能是udp或tcp- 绑定端口是5061(Asterisk默认TLS端口)
- 证书文件路径正确且权限正常
另外,确保这个endpoint只关联了这个TLS Transport,没有同时关联UDP Transport(否则软电话可能会优先选择UDP连接)。
3. 检查拨号计划是否有配置覆盖
打开extensions.conf,查看from-internal上下文的拨号规则,有没有设置PJSIP_MEDIA_ENCRYPTION变量强制关闭加密:
exten => _XXX,1,Set(PJSIP_MEDIA_ENCRYPTION=none)
如果有这条配置,会直接覆盖你在endpoint里设置的media_encryption=sdes,导致媒体不加密。
4. 启用PJSIP日志排查SDP协商过程
这是最直接的排查方法,能看到加密协商的细节:
- 登录Asterisk命令行,执行:
asterisk -rx "pjsip set logger on" - 用软电话发起通话,然后查看日志(可以导出到文件:
asterisk -rx "pjsip set logger on" > /tmp/sip_log.txt) - 重点看INVITE和200 OK消息里的SDP部分:
- 正常的SRTP协商会包含
a=crypto:字段,比如:a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:abcdef1234567890abcdef1234567890|2^20|1:32 - 如果软电话没发送这个字段,说明软电话的加密配置没开;如果Asterisk没回复这个字段,说明SRTP模块没正常工作或者endpoint配置有误。
- 正常的SRTP协商会包含
5. 确认SRTP模块的实际使用状态
你已经确认模块已加载,但可以进一步检查是否有通话在使用它:
asterisk -rx "module show like srtp"
输出里的Use Count如果是0,说明当前没有通话使用SRTP,大概率是协商失败导致的。
最可能的根因总结
结合你的情况,软电话未强制使用TLS信令+媒体加密可选是最常见的原因。先把软电话的传输改成TLS并强制SRTP,再用日志验证协商过程,应该就能解决问题。
内容的提问来源于stack exchange,提问作者scH
相关产品推荐
相关产品推荐

