Настройка защищенного WebRTC в Asterisk: WSS, DTLS-SRTP, ICE и STUN
- Ошибка
ICE failed, see about:webrtc for more detailsв браузере при попытке совершить вызов. - В консоли Asterisk ошибки
DTLS failure / Handshake failedилиNo SRTP module to support crypto suite. - Веб-телефон успешно регистрируется по WSS, но при звонке наблюдается полная тишина и мгновенный сброс через 5 секунд.
- Браузер блокирует подключение к сокету
WebSocket connection to 'wss://...:8089/ws' failed: ERR_CERT_AUTHORITY_INVALID.
1. Настройка встроенного HTTP/WSS сервера в http.conf
Файл /etc/asterisk/http.conf:
[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088
tlsenable=yes
tlsbindaddr=0.0.0.0:8089
tlscertfile=/etc/letsencrypt/live/pbx.example.com/fullchain.pem
tlsprivatekey=/etc/letsencrypt/live/pbx.example.com/privkey.pem2. Создание PJSIP WebRTC Transport и Endpoint
Файл /etc/asterisk/pjsip.conf:
[transport-wss]
type=transport
protocol=wss
bind=0.0.0.0:8089
; --- Шаблон для WebRTC клиентов ---
[webrtc_template](!)
type=endpoint
context=from-internal
disallow=all
allow=opus,ulaw,alaw
dtmf_mode=rfc4733
use_avpf=yes
media_encryption=dtls
dtls_verify=fingerprint
dtls_cert_file=/etc/letsencrypt/live/pbx.example.com/fullchain.pem
dtls_priv_key_file=/etc/letsencrypt/live/pbx.example.com/privkey.pem
dtls_setup=actpass
ice_support=yes
media_use_received_transport=yes
rtcp_mux=yes
[1001-ws](webrtc_template)
auth=1001-auth
aors=1001-aor
[1001-auth]
type=auth
auth_type=userpass
username=1001
password=VeryStrongWebRTCPassword
[1001-aor]
type=aor
max_contacts=3
remove_existing=yes3. Настройка STUN-сервера в rtp.conf
Для корректного сбора ICE-кандидатов отредактируйте /etc/asterisk/rtp.conf:
[general]
rtpstart=10000
rtpend=20000
icesupport=yes
stunaddr=stun.l.google.com:193024. Применение и проверка
asterisk -rx "http show status"
asterisk -rx "pjsip reload"
asterisk -rx "rtp reload" Частые вопросы (FAQ)
Почему WebRTC требует обязательного наличия валидного SSL-сертификата?
Современные браузеры блокируют доступ к API захвата микрофона/камеры (getUserMedia) и отклоняют соединения WebSockets без HTTPS/WSS с доверенным сертификатом (Let's Encrypt или коммерческий CA). Самоподписанные сертификаты вызывают ошибку handshake.
Что такое rtcp_mux и зачем он нужен в WebRTC?
rtcp_mux=yes мультиплексирует потоки RTP (медиа) и RTCP (управляющие пакеты) на один и тот же UDP-порт, что значительно упрощает прохождение межсетевых экранов и ускоряет согласование ICE.
Почему при звонках между WebRTC и обычным SIP-телефоном нет звука?
Обычный SIP-телефон использует незашифрованный RTP (SAVP profile off), а WebRTC строго требует DTLS-SRTP (SAVPF). Убедитесь, что Asterisk скомпилирован с модулями res_srtp, res_crypto и res_http_websocket, выполняя транскодирование и ре-шифрование медиапотока.
Нужен ли TURN-сервер для WebRTC в Asterisk?
Если клиенты находятся за жесткими симметричными NAT (Symmetric NAT / CGNAT в мобильных сетях), прямое P2P/STUN соединение с сервером может не установиться. В этом случае на клиенте (SIP.js) необходимо настроить TURN-сервер (например, Coturn).