Browsed by
Author: Gilson

Chrome/Firefox 用 WebRTC 向 SIP 发起呼叫

Chrome/Firefox 用 WebRTC 向 SIP 发起呼叫

新近发布的 miniSIPServer (V70 build 20250402)支持一个很有趣的特性:我们可以用浏览器(必须支持 WebRTC 技术,例如 Chrome、Firefox 等)向 miniSIPServer 发起呼叫,呼叫 SIP 域的设备(电话、网关等)。网络拓扑如下图所示:

语音媒体流采用端对端加密方式通过 DTLS-SRTP 传递,与 miniSIPServer 连通。目前仅支持语音通话,不支持视频通话。

浏览器 Web 侧采用简化版的信令(MCCP,miniSIPServer Call Control Protocol,即 miniSIPServer 呼叫控制协议)控制呼叫,并通过加密的 Websocket 连接( WSS,Websocket security)与 miniSIPServer 对接。目前仅支持 Web 域向 SIP 域发起呼叫,不支持反向由 SIP 域向 Web 域发起呼叫。

我们在浏览器中输入以下 URL 即可从浏览器向 SIP 域发起呼叫(演示分机用户100 呼叫分机用户 101):

https://www.myvoipapp.com/miniwebphone2/lite.html?server=192.168.3.70&clr=100&pwd=100&cld=101

URL 类似命令行方式,其中各项参数说明如下:

(1)「https://www.myvoipapp.com/miniwebphone2/lite.html」是一个简单的页面,加载到浏览器后即可与指定的 miniSIPServer 服务器建立 WSS 连接,并发起呼叫。我们可以将这个页面及相关的资源都下载到本地或者本地的 Web 服务器,浏览器打开本地文件同样也可以发起呼叫。

(2)「server」指定 miniSIPServer 的地址。该 miniSIPServer 必须已经成功加载证书和密钥、并启动了 WSS 服务。miniSIPServer 默认总是采用 TCP 5062 端口启动 WSS 。

(3)「clr」发起呼叫的主叫用户号码。该号码必须是 miniSIPServer 的分机用户号码。

(4)「pwd」主叫用户用于鉴权的密码,即 miniSIPServer 分机用户的密码。miniSIPServer 用「号码+密码」对呼叫进行鉴权,只有鉴权通过的呼叫才允许接入,否则 miniSIPServer 会直接拒绝呼叫。

(5)「cld」呼叫的被叫号码,可以是本地分机号码,也可以是外呼号码。


语音流通过 DTLS-SRTP 传输,采用端对端协商和加密,miniSIPServer 无需对媒体进行额外配置。

miniSIPServer 仅需要配置证书和密钥启动 WSS 服务,接受浏览器 MCCP 呼叫消息。miniSIPServer 要求(1)证书和密钥保存在「应用数据目录」的「wrtcCert」子目录下;(2)文件必须是 PEM 格式;(3)证书保存为 server.crt 文件,密钥保存为server.key 文件。例如,在 Linux 系统中这两个文件应该如下所示:

$HOME/.minisipserver/wrtcCert/server.crt
$HOME/.minisipserver/wrtcCert/server.key

如果正常加载证书和密钥,miniSIPServer 将启动 WSS 服务并提示以下信息:

如果采用自签名证书,务必要注意在 Chrome、Firefox 等浏览器中允许加载自签名的证书。

Keep-alive

Keep-alive

在 SIP 通信领域,keep-alive (保活)有两种:设备的 keep-alive 与会话(session,dialog)的 keep-alive。

设备的 keep-alive 目前大家都有成熟统一的解决方案,并且符合 RFC3261 的要求,那就是采用 OPTIONS 操作进行检测,如果对端设备返回 200OK 则说明设备 keep-alive。终端采用 REGISTER 也可以检测设备 keep-alive。

各厂家一直都没有会话 keep-alive 的统一解决方案。RFC4028 规范虽然定义了 reINVITE 和 UPDATE 用于会话 keep-alive 检测,但是这两个操作用于会话检测显得太复杂了,会导致重新协商媒体,影响会话的通话质量。

目前各厂家的思路倒是基本一致:既然正常的 reINVITE 和 UPDATE 操作会导致新的媒体协商,那不携带 SDP 是不是就可以直接用于会话的 keep-alive?当然, reINVITE 是例外,「reINVITE without SDP」已经被用于 3PCC 流程,因此不可能再用于会话 keep-alive 操作。

我们根据历年与各厂家设备对接的经验,总结以下用于会话 keep-alive 的操作:

  • UPDATE without SDP
  • INFO without SDP
  • MESSAGE without SDP

最新版本 miniSIPServer 的默认处理方式:如果在会话过程中收到上述三种 SIP 消息,将进入会话 keep-alive 处理流程;如果会话存在,则返回 200OK 消息。

UPDATE 和 INFO 本身就只能在会话中传递,因此天然契合 keep-alive 的要求。我们推荐优先采用 INFO,RFC3261 明确定义了 INFO,各厂家设备一定会支持 INFO 操作。而 UPDATE 操作定义在补充协议中,部分厂家的设备未必会支持 UPDATE,更遑论 「UPDATE without SDP」。

MESSAGE 即可以在会话内传递,也可以在会话外发起,用于传递即时消息(instant message)。我们限定 「MESSAGE without SDP」只能在会话内传递,并保留给 keep-alive 流程处理。

miniSIPPhone V26.1

miniSIPPhone V26.1

最近发布了 miniSIPPhone V26.1 版本,这个版本主要包含以下关键特性或者修改:

一、支持 DTLS-SRTP

miniSIPServer 支持 DTLS-SRTP 之后,我们更新了 miniSIPPhone, 使其也可以过 DTLS-SRTP 加密传输语音流。我们在部署企业通信网络时(尤其是涉及在外部公共云系统部署)完全实现信令、媒体高强度的加密,确保企业通信安全。

在 miniSIPServer 和 miniSIPPhone 我们统一对 DTLS-SRTP 做出以下限制:

(1)DTLS 必须是 DTLSv1.2 及以上版本,不支持低于 v1.2 版本的握手协商。

(2)加密套件固定为 SRTP_AES128_CM_SHA1_80。规范中定义了若干个加密套件,我们采用最高强度的加密,不支持协商其他加密套件。

(3)fingerprint 总是采用 SHA-256 编码,不支持 SHA-1 或者其他的编码方式。

二、简化账号配置

新版本在配置 SIP 账号时,不再需要单独的配置来指定端口,如下图所示:

SIP 账号配置窗体

通常情况下SIP 服务器采用标准端口开放服务,用户确实没有必要了解协议规定的端口信息(我们访问互联网时也很少指定或者了解 80,443等端口),也没有必要去配置端口信息。因此我们删除了「服务器端口」配置项。

但是也存在 SIP 服务器采用非标准端口的情况(例如 miniSIPServer 云采用 6060 端口提供 SIP-TLS 接入,而不是标准定义的 5061 接口),新版本我们可以在「服务器地址」中一起指定地址和端口信息,例如:

15000.s2.minisipserver.com:6060

如果服务器提供的是 IPv6 地址和非标准端口,我们也可以采用以下示例的方式进行设置:

[fe80::5a11:22ff:fe74:8198]:6060
改进「基于 TLS 的 SIP」

改进「基于 TLS 的 SIP」

以前的 miniSIPServer 版本如果想启动「SIP over TLS」,必须配置证书和密钥文件(包括自签名证书和密钥)。如果在配置目录中没有这些文件,miniSIPServer 默认不启动 SIP over TLS。

大部分客户部署「SIP over TLS」都采用自签名证书和密钥。Linux 系统自带 openssl 工具,很容易、也很方便创建这些文件,然而 windows 系统默认没有 openssl 工具,客户需要下载工具来创建证书和密钥,略显麻烦。

为了简化客户的工作量,我们优化了 miniSIPServer 启动「SIP over TLS」的一点步骤:

miniSIPServer 默认总是启动「SIP over TLS」。如果配置了证书和密钥文件,则以客户的证书和密钥加密 SIP 消息;如果没有配置证书和密钥文件,miniSIPServer 自动创建自签名证书和密钥加密 SIP。

因此,miniSIPServer 启动时,我们能看到 TLS 端口信息,这表明 miniSIPServer 启动了「SIP over TLS」:

在SUSE、Fedora等系统上运行 miniSIPServer

在SUSE、Fedora等系统上运行 miniSIPServer

我们通常只在 Debian、Ubuntu 系统上开发和发布适用于 Linux 系统的 miniSIPServer 软件,默认采用 deb 安装包发布版本。如果用户是 Linux 宇宙另一个派系——RPM派,要部署 miniSIPServer 就不太方便。越来越多的客户希望能在 SUSE、Fedora、openEuler 等操作系统上部署 miniSIPServer。

考虑到我们没有充足的资源(包括人力、设备等),我们决定发布 AppImage 格式的安装包,这样几乎可以适配所有非 Debian 系列的 Linux 系统。当然,目前仅适配 X86_64 (AMD64) 架构,暂时没有适配 ARM64 架构。

请从网站下载对应的版本:

使用非常简单,甚至无需安装。将下载的 miniSIPServer 软件(比如 minisipserver_u500.AppImage)保存在任意目录下,然后设置「可执行权限」:

chmod +x minisipserver_u500.AppImage

双击该文件或者在命令行下直接运行该文件即可:

./minisipserver_u500.AppImage

其他与安装 deb 包的方式是一样的。配置文件也都是保存在 $HOME/.minisipserver 目录下。

我们分别测试了 openSUSE(Leap 16)、Fedora 42 以及 openEuler (24.03 LTS SP2) ,效果不错:

openSUSE 运行效果图
在 Fedora 系统中运行 miniSIPServer
在 openEuler 系统中运行 miniSIPServer

欢迎大家试用!

优化「连选组」业务

优化「连选组」业务

「连选组」是一项非常古老的企业通信业务,在电路电话时代就有广泛的应用, VoIP 时代也仍然有大量的企业部署该业务。然而时代毕竟变了,业务本身也需要与时俱进,适应 IP 网络的特点和要求。我们依据最近客户的需求和网络环境的变化,对 miniSIPServer 的「连选组」业务做了一些优化。

主要是对业务中的「话务员」特性进行修改和优化,请参考下图:

连选组话务员配置

修改一:一位话务员可以同时配置在多个连选组中。以往限定了一位话务员只能配置在一个连续组中,这已经不符合现代企业的要求。企业中有些员工往往承担复合性工作,因此有很大可能需要同时支持多个连选组,新特性适配了这个需求。

在电路电话时代,话机终端缺乏足够的能力,因此通常「连选组」会允许话务员拨打特定的电话登录、或者登出连选组。出于以下几方面的考虑,miniSIPServer 新连选组业务不再支持话务员登录、登出操作:(1)如今的 SIP 终端多数都具备足够的能力,可以在终端侧实现「免打扰」等功能,因此没有必要再手工登录或者登出。(2)一位话务员同时支持多个连选组后,简单的登录、登出无法满足需要,需要修改为针对特定的连选组进行操作,拨号变得繁琐而没有必要。

修改二:如果连选组的组策略是「线性策略」,我们可以指定话务员的顺序号,从而设定话务员被选择的顺序。以往是按照话务员登录系统的先后顺序默认为组的选择顺序,其实就是随机顺序,这无法满足目前的需求,实际情况中有些话务员在组内的优先级别总是会有差异。话务员设定的「线性策略顺序号」越小,则越先被连选组选中。如果顺序号相同,则以登录系统的时间进行排序,先登录的优先被选择。

当然,这个新配置项对「轮选策略」无效,「轮选策略」总是尽量均匀地选择话务员,均匀分配工作量。

本地 miniSIPServer 和 云 miniSIPServer 的「连选组」业务都已经更新。业务的配置和使用都没有差异,请参考业务文档了解更详细的信息。

安全的企业 SIP 通信

安全的企业 SIP 通信

企业内部的通信系统一般部署在私网内部,在网络边缘部署 SBC 或者语音网关与外部进行通信,因此大部分场景下企业通信都很安全。然而越来越多的企业在云端部署 SIP 服务器,而企业内部的 SIP 终端也越来越多地从外部网络接入企业 SIP 服务器,这使得部分(或者全部)企业通信系统暴露在公共网络中,安全问题日益严重。

企业 SIP 通信安全涉及网络系统的许多方面,例如防火墙等。仅就 SIP 通信本身而言必须加密,避免将通信信息暴露给其他网络用户。加密的 SIP 通信包含两个部分:(1)SIP 消息(信令)加密,以及(2)语音流(RTP)加密,如下图所示:

SIP 加密通信网络拓扑

当然,企业可以部署 VPN 将整个网络系统(不仅仅是通信系统,也包括办公系统等)进行加密,加密的 SIP 通信也可以建立在 VPN 之上。建立企业 VPN 成本比较高、系统比较复杂,本文仅讨论加密的 SIP 通信,不涉及VPN 等其他网络安全技术。

SIP 消息的加密通过「SIP over TLS」实现,云 miniSIPServer、本地 miniSIPServer 以及 miniSIPPhone 都支持 SIP over TLSv1.2 / TLSv1.3。请参考在线文档,本文不再赘述。

语音流通过 SRTP (或者 DTLS-SRTP)传输实现加密,SRTP 的 master key 和 master salt 通过 SIP 消息的 SDP ( RFC4568 )传输、协商,因此 SIP 消息加密才能确保 SRTP 的关键信息不会泄露,仅仅 SRTP 传输加密语音流、但是明文传递 SIP 消息,不能确保整个 SIP 通信的安全性。

RFC4568 中定义了几种加密套件,目前我们选择支持默认的 AES_CM_128_HMAC_SHA1_80 ,暂不支持其他加密套件。

SRTP 协议族包含诸多扩展,目前 miniSIPServer 和 miniSIPPhone 支持最基础的 RFC3711 协议,这也是绝大多数 SIP 设备(包括服务器、PBX、SBC 以及终端)都支持的基础 SRTP 协议;同时也支持 RFC5763, 也就是支持 DTLS-SRTP——目前市面上有很多 SIP 终端设备并不支持 DTLS-SRTP,如果需要部署,需要仔细检查终端的能力。

miniSIPServer 和 miniSIPPhone 默认可以选择 SRTP,无需额外的配置。部分 SIP 设备需要明确配置是否选择 SRTP,例如 MicroSIP 在配置账号时,「Media Encryption」需做以下设定:

MicroSIP 配置 SRTP
上传 IVR-XML 以及语音文件

上传 IVR-XML 以及语音文件

miniSIPServer 云允许用户定义自己的 IVR-XML 文件以及相关的语音文件,以满足用户自己公司 IVR 业务的特定要求。但是这些文件需要发送给我们的支持团队,帮助上传到用户的虚拟服务器中。

这确实有点繁琐,也非常不方便。

因此我们最近更新了云系统,允许用户自己上传 IVR-XML文件以及语音文件到虚拟服务器中。请点击菜单“账户 – IVR-XML 文件(或者语音文件)”完成操作即可。

当然, IVR-XML 文件必须遵循 IVR-XML 技术规范的要求,而语音文件也必须符合 miniSIPServer 语音编码要求。

欢迎! Debian 13 (Trixie)!

欢迎! Debian 13 (Trixie)!

Debian 13 (Trixie) 昨天发布了。这个版本是最新的稳定版本,非常适合商业部署。我们是 Debian 系统的忠诚粉丝,第一时间在该系统上安装、测试了 miniSIPServer。所有的测试用例都通过了,结果很完美!

在 Debian 13 (Trixie) 系统上运行 miniSIPServer

您可以在 Trixie 系统上部署 miniSIPServer,构建企业通讯环境,这绝对是一个令人兴奋的选择!

miniSIPPhone 支持 SIP over TCP/TLS

miniSIPPhone 支持 SIP over TCP/TLS

是的,我们又升级 miniSIPPhone了!

miniSIPPhone V10.10 现在可以支持 SIP over TCP/TLS。在 SIP 账户的配置中新增了“传输”一项,用于指定采用哪种传输方式连接 SIP 服务器:

SIP 账户中“传输”项的配置

如果采用 SIP over TLS,那所有的 SIP 消息都是加密传输。如果企业通信系统中的设备(分机或者服务器)是部署在公共网络,那就非常有必要对通信内容进行加密保护。我们知道云 miniSIPServer 系统支持 SIP over TLS,而且云系统都部署在公共网络中,因此如果客户端同时部署 miniSIPPhone 的话,整个企业 VoIP 系统显然会更安全。

当然,miniSIPPhone 也可以与其他支持 SIP over TCP/TLS 的服务器(或者 PBX )一起工作,共同构建完整、安全的企业通信系统。