VoIP Infrastructure Asterisk 20 · WebRTC · PJSIP VitalPBX · Debian 12

VoIP-инфраструктура: развёртывание корпоративной телефонии с WebRTC

Международная компания, удалённые сотрудники, звонки через браузер. Критическая несовместимость DTLS/ECDSA устранена через нестандартную конфигурацию транспорта — без обходных решений.

DTLS
корень проблемы — хендшейк на уровне транспорта
RSA fix
self-signed вместо ECDSA, полная совместимость
2 ext
SIP-экстеншена, WebRTC через браузер
live
двустороннее аудио, система в эксплуатации
Контекст
Международная компания: корпоративная АТС с WebRTC-звонками через браузер, внешние DID-номера через voip.ms, поддержка удалённых сотрудников. Стек: VitalPBX + Asterisk 20 на Debian 12, WebRTC-клиент VitXi.
VitXi WebRTC voip.ms DID Remote workers
Проблема
Asterisk 20 + ECDSA = аудио не проходит в обе стороны. Соединение устанавливается, DTLS-хендшейк завершается, но RTP-поток обрывается. Стандартная документация решения не давала.
ECDSA incompatible No audio RTP NAT traversal fail
Архитектура решения
Финальный стек: Browser → nginx → Asterisk → voip.ms
Каждый слой решает отдельную задачу: TLS-терминация, DTLS медиа, NAT, SIP-транк
🌐
Browser
VitXi WebRTC
WSS
HTTPS/WSS
nginx
reverse proxy
SSL termination
Let's Encrypt
WS + DTLS
Asterisk 20
PJSIP · WebRTC
RSA self-signed
RSA cert
SIP/TLS
📡
voip.ms
SIP trunk
sub-account
SIP trunk
PSTN
📞
DID
внешний номер
+1 (904) xxx
PSTN
Fix 1 — DTLS Certificate
ECDSA → RSA self-signed
Asterisk 20 некорректно обрабатывал ECDSA при DTLS-хендшейке с VitXi — переход на RSA решил проблему полностью
root cause
DTLS / ECDSA
pjsip — ECDSA (сломано)
;; /etc/asterisk/pjsip__20-transport.conf [transport-wss] type=transport protocol=wss cert_file=/etc/letsencrypt/live/ domain/fullchain.pem priv_key_file=/etc/letsencrypt/ live/domain/privkey.pem ;; ❌ ECDSA — Asterisk 20 bug ;; audio не проходит в обе стороны method=tlsv1_2
pjsip — RSA self-signed (✓)
;; /etc/asterisk/pjsip__20-transport.conf [transport-wss] type=transport protocol=wss cert_file=/etc/asterisk/ dtls-cert.pem priv_key_file=/etc/asterisk/ dtls-key.pem ;; ✓ RSA 2048 self-signed ;; полная совместимость с Asterisk 20 method=tlsv1_2
Генерация RSA self-signed для DTLS
# RSA 2048, срок 10 лет, для DTLS в Asterisk openssl req -x509 -newkey rsa:2048 \ -keyout /etc/asterisk/dtls-key.pem \ -out /etc/asterisk/dtls-cert.pem \ -days 3650 -nodes \ -subj "/CN=asterisk-dtls" # права — только asterisk читает ключ chown asterisk:asterisk /etc/asterisk/dtls-*.pem chmod 600 /etc/asterisk/dtls-key.pem
Fix 2 — NAT traversal
Синтаксис (+) append в pjsip NAT
Стандартный external_media_address не работал в нестандартной топологии — append-синтаксис обеспечил корректный SDP без STUN
issue
NAT / SDP
pjsip__15-nat.conf (сломано)
[global] type=global ;; ❌ перезаписывает дефолтные значения external_media_address=159.198.74.173 external_signaling_address=159.198.74.173 ;; ❌ RTP отправляется на внутренний IP ;; SDP содержит 192.168.x.x → audio fail
pjsip__15-nat.conf — (+) append (✓)
[global](+) ;; (+) = append к существующей секции external_media_address=159.198.74.173 external_signaling_address=159.198.74.173 ;; ✓ SDP анонсирует публичный IP ;; RTP доходит до браузера без STUN [transport-wss](+) local_net=10.0.0.0/8 local_net=192.168.0.0/16
Fix 3 — nginx reverse proxy
WebSocket upgrade + SSL для VitXi
Корректный проброс WebSocket-соединения с нужными заголовками для WebRTC-клиента
config
nginx / WSS
/etc/nginx/sites-enabled/vitalpbx — WebRTC proxy
# WebSocket → Asterisk PJSIP WSS transport location /ws { proxy_pass https://127.0.0.1:8089; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_ssl_verify off; # self-signed DTLS cert } # SSL — Let's Encrypt (ECDSA) для браузера # Asterisk видит только RSA self-signed внутри ssl_certificate /etc/letsencrypt/live/domain/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3;
Устранённые проблемы: ✓ DTLS/ECDSA fix ✓ NAT append ✓ nginx WSS ✓ двусторонний RTP
Live ✓
Результат
Система введена в эксплуатацию в срок. Двустороннее аудио через браузер работает стабильно. Подготовлена документация для передачи клиенту с описанием всех нестандартных решений — DTLS-фикса, NAT-конфигурации и схемы nginx-проксирования.
VitalPBX 4.5
Asterisk 20 · PJSIP
WebRTC · VitXi client
DTLS-SRTP · RSA fix
nginx · reverse proxy
voip.ms · SIP trunk
Debian 12

Есть задача? Давайте разберём её

Расскажите что происходит — мы скажем можем ли помочь и как это выглядит по деньгам и срокам. Без обязательств.