Asterisk con Websockets para WebRTC y probando SIPML5

ATENCIÓN: Este artículo ya no es útil puesto que Chrome en su versión 35 en adelante ha pasado su sistema de encriptación para WebRTC de SDES a SRTP/DTLS como estaba planificado desde principios de Enero 2014. Este articulo definía el metodo para montar un sistema Asterisk basado en este sistema. Cuando salga la resolución definitiva en Asterisk creare otro articulo para explicar como configurar con Asterisk este sistema

Volviendo a la carga con Artículos sobre Asterisk, voy a explicar algo que aunque ya está algo visto, ha sido parte de mi experiencia y como viendo haciendo hasta ahora intento explicarlo con el mayor número de detalles

Hay que considerar que en este momento estoy trabajando con la versión CERT de Asterisk concretamente la versión 11.6-cert1

webrtc asterisk

Preparando la instalación del Sistema Asterisk para WebRTC

En primer lugar, sería conveniente tener soporte para el códec OPUS que es una de las claves que WebRTC utilizan de forma nativa y quizá sea de las principales ventajas de su uso.

Si no tenemos autoconf necesitamos instalarlo y también hará falta libtool y pkg-config

# apt-get install autoconf libtool pkg-config

ATENCIÓN (Con Asterisk  >11.6) si compilamos con soporte OPUS habrá un problema de AUDIO (Issue en Git de Meetecho: https://github.com/meetecho/asterisk-opus/issues/6). Por eso este paso de instalación de Opus en este tipo de versiones, seria conveniente saltárselo de momento a partir de aquí:

Para ello lo podemos descargar desde el repositorio GIT de este proyecto. Tenemos que descargar este fichero en el directorio raíz donde esta el código de Asterisk listo para ser compilado.

#wget https://raw.github.com/meetecho/asterisk-opus/master/asterisk_opus+vp8.diff

Desde ahí lanzamos el parche

# patch -p1 -u < asterisk_opus+vp8.diff

Y a continuación preparamos el sistema para que pueda instalarse el códec OPUS:

# ./bootstrap.sh

En mi caso, trabajando con Ubuntu Server 12.04, me hace falta instalar la librería Opus en el sistema, que no viene en los repositorios de Ubuntu por defecto:

# apt-get install python-software-properties
# add-apt-repository ppa:ubuntu-sdk-team/ppa
# apt-get update
# apt-get install libopus-dev

Después de instalar el códec OPUS pasamos a instalar el resto de las dependencias para su funcionamiento

También nos hará falta la librería libsrtp0-dev para gestionar la encriptación de las conexiones WebRTC y las librerias de Universally Unique Identifier, uuid-dev (este último es específico la versión 11 de Asterisk y su no instalación provocaría problemas en la comunicación con ICE, y aunque la llamada entraría en el sistema, no se escucharía nada por una cuestión de RTP) . Podemos instalarlas directamente desde los repositorios del sistema:

# apt-get install libsrtp0-dev libsrtp0 uuid-dev

Con todo preparado realizamos la instalación de Asterisk

# ./configure --with-crypto --with-ssl --with-srtp=/usr/lib

Finalmente seleccionamos el códec Opus y Formato VP8 con make menuselect (Codec Translators -> códec_opus y Format Interpreters -> format_vp8)

Por otro lado, para instalar nuestro sistema websockets en Asterisk primero deberemos instalar el Recurso HTTP Websocket. Esto se realiza durante la instalación de Asterisk (make menuselect) en la sección Resource Modules, y cuyo nombre es res_http_websocket

También se recomienda por cuestiones de calidad, seleccionar los paquetes musicales tanto los mensajes de Asterisk como los de Music On Hold en formato SLN16 (CORE-SOUNDS-ES-SLN16, MOH-OPSOUND-SLN16 y EXTRA-SOUNDS-EN-SLN16)

Y ya podemos compilar Asterisk con todo el soporte necesario

# make && make install

Configurando Asterisk y Websockets

A partir de aquí ya tenemos el sistema preparado para ser configurado simplemente. En primer lugar configurador el servidor HTTP de Asterisk desde el fichero http.conf

[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088

A continuación pasamos a configurar el soporte ICE y STUN en el fichero RTP.conf para ello añadimos las líneas dentro de la etiqueta [general]

icesupport=true
stunaddr=stun.l.google.com:19302

Finalmente pasamos a configurar un peer SIP para que soporte la comunicación con WebSockets. En el fichero sip.conf dentro de la etiqueta [general]:

allowguest=no
udpbindaddr=0.0.0.0:5060

Y creamos una extensión con los siguientes parámetros

[extension1]
secret=miclavesecreta
transport=udp,wss,ws
encryption=yes
avpf=yes
icesupport=yes
directmedia=no
host=dynamic
nat=force_rport,comedia
qualify=yes // opcional
type=friend
context=phones

Con todo esto solo necesitaremos configurar en nuestro servidor Web un softphone basado en WebRTC y que soporte WebSockets (esto es opcional, si tenemos publicado el servidor SIP el webphone RTC se conectaría directamente, los websockets serían utiles en caso que definieramos en el sip.conf un nombre al dominio (con la propiedad realm) y conectáramos a este realm a traves de una conexión con Websockets (otra de las claves principales de WebRTC junto al Codec OPUS). Por ejemplo,supongamos la dirección pública de nuestro servidor es 123.123.123.123 y hemos abierto el puerto 8088 (del servidor HTTP de Asterisk para habilitar los Websockets). Configuramos en el fichero sip.conf,

[general]
realm=10000horas.com

Ahora en el softphone configuramos (por ejemplo SIPML5, aunque pongo otras opciones más adelante):

Private Entity: la extensión usada, en este caso extension1
Publc Entity: sip:extension1@10000horas.com
Password: la_password_de_la_extension
Realm: 10000horas.com

Y en el apartado «Expert» debemos configurar la dirección a la que apunta el Websocket. Usando comunicación Websockets sin encriptar:

Websocket Server URL: ws://123.123.123.123:8088/ws

Así estableceríamos la conexión en vez de directamente al servidor SIP, lo haríamos gracias al servidor WebSocket, lo que es bastante provechoso y podríamos llegar a incrementar la seguridad del sistema (considerando que tener el Puerto 5060 a libre albedrío es peligroso, aunque no todos opinan lo mismo)

Disponemos de varias opciones entre las más populares SIPML5 y JsSIP. De todas formas si tenemos el servidor delante de un firewall o hemos gestionado los puertos correspondientes podríamos hacer una prueba desde cada uno de los sistemas:

SIPML5: http://sipml5.org/call.htm
JsSIP: http://tryit.jssip.net/

Espero que os haya servido, os recomiendo el cliente de escritorio Phoner Lite (http://phonerlite.de/index_en.htm) si queréis hacer pruebas ya que es de los pocos Softphones que dispone del códec OPUS por defecto.

12 comentarios en «Asterisk con Websockets para WebRTC y probando SIPML5»

  1. Hola buscando información sobre instalar el codec opus en asterisk (11.8 es la versión que tengo) he visto ésta web, he seguido los pasos que comentas pero al realizar patch -p1 -u < asterisk_opus+vp8.diff salen éstos errores
    patch -p1 -u < asterisk_opus+vp8.diff
    patching file build_tools/menuselect-deps.in
    Hunk #1 FAILED at 40.
    1 out of 1 hunk FAILED — saving rejects to file build_tools/menuselect-deps.in.rej
    patching file channels/chan_sip.c
    Hunk #1 FAILED at 7724.
    Hunk #2 FAILED at 10982.
    Hunk #3 FAILED at 11021.
    Hunk #4 FAILED at 11041.
    Hunk #5 FAILED at 12583.
    Hunk #6 FAILED at 12612.
    6 out of 6 hunks FAILED — saving rejects to file channels/chan_sip.c.rej
    The next patch would create the file codecs/codec_opus.c,
    which already exists! Assume -R? [n]
    Apply anyway? [n]
    Skipping patch.
    1 out of 1 hunk ignored
    The next patch would create the file codecs/ex_opus.h,
    which already exists! Assume -R? [n]
    Apply anyway? [n]
    Skipping patch.
    1 out of 1 hunk ignored
    patching file configure.ac
    Hunk #1 FAILED at 422.
    Hunk #2 FAILED at 2086.
    2 out of 2 hunks FAILED — saving rejects to file configure.ac.rej
    The next patch would create the file formats/format_vp8.c,
    which already exists! Assume -R? [n]
    Apply anyway? [n] y
    patching file formats/format_vp8.c
    Hunk #1 FAILED at 1.
    1 out of 1 hunk FAILED — saving rejects to file formats/format_vp8.c.rej
    patching file include/asterisk/format.h
    Hunk #1 FAILED at 101.
    Hunk #2 FAILED at 112.
    2 out of 2 hunks FAILED — saving rejects to file include/asterisk/format.h.rej
    patching file main/channel.c
    Hunk #1 FAILED at 909.
    1 out of 1 hunk FAILED — saving rejects to file main/channel.c.rej
    patching file main/format.c
    Hunk #1 FAILED at 430.
    Hunk #2 FAILED at 449.
    Hunk #3 FAILED at 532.
    Hunk #4 FAILED at 551.
    Hunk #5 FAILED at 782.
    Hunk #6 FAILED at 1072.
    6 out of 6 hunks FAILED — saving rejects to file main/format.c.rej
    patching file main/frame.c
    Hunk #1 FAILED at 1002.
    Hunk #2 FAILED at 1083.
    2 out of 2 hunks FAILED — saving rejects to file main/frame.c.rej
    patching file main/rtp_engine.c
    Hunk #1 FAILED at 2268.
    Hunk #2 FAILED at 2309.
    2 out of 2 hunks FAILED — saving rejects to file main/rtp_engine.c.rej
    patching file makeopts.in
    Hunk #1 FAILED at 261.
    1 out of 1 hunk FAILED — saving rejects to file makeopts.in.rej
    patching file res/res_rtp_asterisk.c
    Hunk #1 FAILED at 91.
    Hunk #2 FAILED at 341.
    Hunk #3 FAILED at 2599.
    Hunk #4 FAILED at 2650.
    4 out of 4 hunks FAILED — saving rejects to file res/res_rtp_asterisk.c.rej

    Al realizar ./bootstrap.sh

    Indica -bash: ./bootstrap.sh: No such file or directory

    Y no puedo continuar, no sé si falta algo mas por instalar o que estoy haciendo mal, espero que me puedan ayudar.
    Un saludo y enhorabuena por la web los articulos son de muy buena calidad.

  2. Hola David,
    Como leiste en el articulo las versiones de Asterisk por encima de la 11.5 no funciona el codec Opus, por eso recomiendo no instalarlo y utilizar el G.711 por defecto para la comunicación con websockets.

  3. A vale disculpa no lo leí, pensaba que se podía utilizar el codec opus con asterisk, en verdad es para utilizarlo con un softphone para una prueba con un cliente que tiene una conexión de adsl de 3mb y he leido que éste codec se adapta al ancho de banda.
    Gracias por la aclaración y un saludo.

  4. he realizado los pasos y el peer se firma sin problemas pero al momento de mandar una llamada siempre recibo el error en la consola de » WARNING[2749][C-0000001d]: chan_sip.c:10455 process_sdp: Rejecting secure audio stream without encryption details: audio 40592 UDP/TLS/RTP/SAVPF 109 0 8 101″, por lo que he leído es porque se intenta realizar la ecriptación pero al usar wss ni siquiera logro firmar el peer

  5. He seguido los pasos y al realizar las pruebas tanto con sipml5 y jssip se firma bien la cuenta, pero me aparece el siguiente error el la consola de asterisk «chan_sip.c:10455 process_sdp: Rejecting secure audio stream without encryption details: audio 50772 UDP/TLS/RTP/SAVPF 109 0 8 101», por lo que he podido leer el problema es al encriptar el canal pero no logro hacer que funcione el wss, ¿alguna idea del problema?

  6. No se que navegador usas, pero si es Chrome, el problema que encontraras es que desde principios de año planificaron el cambio de SDES a SRTP/DTLS sistema de encriptacion que Asterisk soporta pesimamente y no hay ni planes de soportarlo a largo plazo, asi que este articulo ha quedado invalidado para siempre a expensas a ver que resolucion dan desde Digium (pero ni siquiera la comunidad ha sacado un patch release estable todavia)

  7. Buenas.
    He hecho alguna prueba con las cuentas gratuitas de sip2sip (wss) que el mismo sipml5 indica y Chrome funciona correctamente. ¿Esto quiere decir que sobre websocket seguro si que funciona?

    Saludos.

  8. Albert, estoy realizando un proyecto y veo que en pagina no segura ( http) en chrome no funciona por lo ya expuesto,. Indicas tu que has hecho ´prueba en wss ( seguro ) y si funciona. Que cambios hiciste puedes trasmitir tus cosas.

  9. Albert bajo tu coentario:
    Buenas.
    He hecho alguna prueba con las cuentas gratuitas de sip2sip (wss) que el mismo sipml5 indica y Chrome funciona correctamente. ¿Esto quiere decir que sobre websocket seguro si que funciona?

    Me puedes idnicar que pasos seguiste, estoy realiznado pruebas y no ubico un documento que me pueda establecer esa clase de pruebas. gracias seria de mucha ayuda.

  10. Han cambiado muchas cosas en los WS desde que publique este articulo. Quiza reescriba una nuevo con info mas actualizada sobre los WSS necesarios para las nuevas versiones de Chrome

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.