miércoles, 11 de julio de 2012

SIP TLS y SRTP en Elastix

Asterisk tiene soporte para encripción TLS para la señalización SIP y SRTP para encriptar las llamadas.

Todas las configuraciones fueron hechas en dos servidores cargados con la versión 2.3 de Elastix de 64 bits.

Elastix 2.3 tiene instalado todo lo necesario para soportar TLS y SRTP, solo hay que hacer unas pequeñas modificaciones.

Voy a empezar explicando como encriptar las comunicaciones en una troncal SIP entre dos servidores Elastix, para lo cual:

Servidor 1 con Elastix=serverA
Servidor 2 con Elastix=serverB

Primero se deben generar certificados para los servidores, esto se debe hacer solo en uno de ellos, para el ejemplo lo voy a hacer en el serverA. Para generar los certificados voy a usar el script ast_tls_cert, que se encuentra en:

/usr/share/doc/asterisk-1.8.11.0/contrib/scripts/ast_tls_cert

Vamos al directorio donde se encuentra el script:


cd /usr/share/doc/asterisk-1.8.11.0/contrib/scripts/

Aqui ejecutamos lo siguiente:

./ast_tls_cert -d certs -C serverA -o serverA


./ast_tls_cert -d certs -C serverB -o serverB -c certs/car.crt -k certs/ca.key


 cd certs

 ls

Se observa que se han creado 12 archivos.

Luego de que los certificados han sido creados, se deben mover hacia las ubicaciones respectivas tanto en el serverA como en el serverB. En el serverA:

mv ca.crt /var/lib/asterisk/keys
 
mv serverA.pem /var/lib/asterisk/keys

Y para el serverB:

scp ca.crt root@ip-del-serverB:/var/lib/asterisk/keys



scp serverB.pem root@ip-del-serverB:/var/lib/asterisk/keys

Se deben dar los permisos suficientes a los archivos para que puedan ser leidos por asterisk (yo les di permisos totales, se podria probar cambiando de propietario de los archivos con el comando chown). Esto se debe hacer en ambos servidores.

chmod -R 777 /var/lib/asterisk/keys/

Luego vamos al explorador, ingresamos al Elastix y habilitamos el acceso al FreePBX no embebido, esto se lo hace yendo a la pestaña Security -> Advanced Options -> Enable access to FreePBX -> ON. Luego en una nueva pestaña del explorador se debe poner lo siguiente:

https://ip-del-elastix/admin

Aqui va a solicitar el usuario y contraseña para ingresar.

Una vez adentro de FreePBX no embebido, se debe ir a la sección (ubicada en la esquina superior izquierda) Tools -> Asterisk SIP Settings. Aquí se pueden editar las configuraciones generales para SIP. En la parte final hay una sección que dice Other SIP Settings, ahi ponemos lo siguiente:

tlsenable=yes
tlsbindaddr=0.0.0.0
tlsdontverifyserver=yes
tlscertfile=/var/lib/asterisk/keys/serverA.pem
tlscafile=/var/lib/asterisk/keys/ca.crt

Esto se debe hacer en ambos servidores, para lo cual hay que tomar en cuenta que el parámetro tlscertfile cambiaría de esta manera en el serverB:

tlscertfile=/var/lib/asterisk/keys/serverB.pem

NOTA: Cuando se crean los certificados, el parámetro definido con la opción -C debe coincidir con el hostname. Si se presenta un problema con el hostname, para corregirlo se debe generar el certificado nuevamente. Tambien se puede agregar el parámetro tlsdontverifyserver=yes en la configuración anterior, que no verifica el hostname.

Por último en la interfaz web de Elastix vamos a PBX -> PBX Configuration -> Trunks -> Add Trunk -> Add SIP Trunk. En donde ponemos:

  • Para el serverA:
Trunk Name: troncal-prueba

En Outgoing Settings:

Trunk Name: serverA-serverB

Peer Settings:

host=ip-del-serverB
secret=contraseña

type=friend
context=from-internal
insecure=invite
canreinvite=no
qualify=yes
encryption=yes
transport=tls


  • Para el serverB:

Trunk Name: troncal-prueba


En Outgoing Settings:

Trunk Name: serverA-serverB

Peer Settings:

host=ip-del-serverA
secret=contraseña

type=friend
context=from-internal
insecure=invite
canreinvite=no
qualify=yes
encryption=yes
transport=tls


Eso es todo, pueden probar usando un sniffer, y verán que la comunicación es encriptada. En una siguiente entrega les indicare lo realizado para encriptar la comunicaciones entre extensiones usando teléfonos SIP.

4 comentarios:

Sergio Galeotti dijo...

Hola Juan:
Muy buena y clara tu explicacion, gracias por detallar los pasos.
La pregunta es, pudiste probar como hacer lo mismo, pero para que un Telefono IP se conecte de forma segura a un Elastix, utilizando TLS??
Yo estoy intentandolo con Freeswitch, sigo los pasos al pie de la letra y pareceria que funciona pero por algun motivo no logro que los telefonos se registren cuando los seteo para que utilicen TLS.
Si tenes los datos para hacerlo con Elastix y sos tan amable, podrias pasarlo?
Nuevamente muchas gracias.

Sergio

Unknown dijo...

Te recomiendo revises si asterisk escucha en el puerto 5061, que es el puerto para que los teléfonos se registren usando TLS. Lo puedes comprobar ejecutando el siguiente comando:
#: netstat -atunp | grep 506
Tambien puedes probar por partes es decir, activando solo el SRTP, y dejando el campo transport=UDP, que es por defecto. Avisame como te va.
Saludos.

aprendeconcastro dijo...

Una consulta necesito realizar un cifrado de llamadas VoIP en PBX Elastix, usando el protocolo Diameter(usa tls y srtp tambien). Apreciaria mucho la ayuda y consejos

Stefanny dijo...

Hola buena tarde Juan

Me gustaria saber si en algun momento has levantado una troncal SIP TLS entre un PBX elastics y un equipo CUBE Cisco?

Espero me puedas apoyar.

Saludos