Conectar dos servidores Asterisk con SIP-TLS

Unos de los problemas de Asterisk es que hasta la versión 1.6.X, no soportaba el protocolo TLS para la señalización SIP. Aunque en las primeras versiones de la rama 1.6.X este soporte no era muy estable, parece que ha ido mejorando.

¿Porque implementar el protocolo TLS en SIP?

Porque de esta forma aumentamos la seguridad de nuestra centralita ya que todos los “mensajes” SIP viajarán por la red cifrados. Muy importante si además de eso, estamos utilizando la versión 1.8 de Asterisk que soporta el protocolo SRTP (Secure Real Time Protocol); en el protocolo SRTP las llaves para el cifrado del audio se envían a través del protocolo SDB (Session description protocol) che es un mensaje que viaja anexo al mensaje SIP. Si el mensaje SIP no esta cifrado, las llaves se enviarán en texto plano dejando abierta la posibilidad que alguien pueda aprovechar esta situación.

En este articulo veremos como conectar dos servidores Asterisk utilizando el protocolo SIP con TLS y como efectuar llamadas entre los dos.

 

Servidor Asterisk A (serverA):

versión: 1.6.2.13

dominio sip.servidora.com

Extensiones: de 1000 a 1009

Servidor Asterisk B (serverB)

versión 1.8.0

dominio sip.servidorb.com

Extensiones de 3000 a 3009

Los certificados

La parte más importante de la configuración, es la creación de los certificados. Podemos hacerlo de dos formas:

  • crear certificados autofirmados
  • crear certificados firmados por una autoridad reconocida

En este caso se ha optado para una solución intermedia, es decir, utilizar como entidad certificadora a CAcert que aunque no sea todavía reconocida oficialmente, es una entidad confiable.

Antes que nada entramos en la pagina web de CAcert e creamos una nueva cuenta. Terminada esta operación tenemos que añadir nuestros dominios (servidora.com y servidorb.com).

En la pagina de administración de nuestra cuenta escogemos el menú “Domains” y luego la opción “Add”:

siptls1

En la pagina que sigue escribimos el nombre del dominio y seguimos presionando el botón “I own or am autorised to control this domain”

siptls2

El la siguiente pagina tenemos que seleccionar un correo electrónico existente para el dominio que queremos registrar:

siptls3

A esa dirección nos llegará un correo electrónico con un enlace que deberemos utilizar para confirmar que somos los dueños del dominio que estamos registrando. Una ver terminada esta operación, seguimos el mismo procedimiento para el servidorb.com.

Cuando tengamos los dos servidores registrados y verificados, podemos crear nuestros certificados. En ambos servidores hay que crear un CSR (Certificate Signing Request) que sería nuestra solicitud para decirle a CAcert que nos firme un certificado.

 

Servidor A:

desde la consola de Linux escribimos:

cd /etc/asterisk

openssl req -nodes -new -keyout sip.servidora.com.key -out sip.servidora.com.csr

Rellenamos los datos del certificado prestando mucha atención a la línea Common Name (en negrita) donde hay que indicar sip.servidora.com:

Generating a 1024 bit RSA private key
...++++++
..............................................++++++
writing new private key to 'sip.servidora.com'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:CO
State or Province Name (full name) [Berkshire]:
Locality Name (eg, city) [Newbury]:Bogota
Organization Name (eg, company) [My Company Ltd]:ServidorA
Organizational Unit Name (eg, section) []:VoIP
Common Name (eg, your name or your server's hostname) []:sip.servidora.com
Email Address []:admin@servidora.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Se generarán dos certificado:

  • sip.servidora.com.key
  • sip.servidora.com.csr

Volvemos a la pagina de CAcert y vamos al menú “Server Certificates”:

siptls4

Escogemos la opción “New” y en la pagina que sigue pegamos el contenido del archivo sip.servidora.com.csr:

siptl5

 

hundimos el botón Submit y en la pagina que sigue otra vez Submit. El sistema nos devolverá el certificado firmado. Lo copiamos y lo pegamos en un nuevo archivo que llamaremos:

sip.servidora.com.crt.

Ahora bajamos el certificado Root de CAcert en formato PEM:

wget http://www.cacert.org/certs/root.crt

lo renombramos:

mv root.crt cacert.crt

En la versión 1.6.2.13 de Asterisk el certificado y la clave tienen que estar en el mismo archivo:

cat sip.servidora.com.crt sip.servidora.com.key > asterisk.pem

Terminada la operación podemos pasar  a la configuración de Asterisk:

nano sip.conf

la parte general:

realm=sip.servidora.com

tlsenable=yes
tlsbindaddr=0.0.0.0
tlscertfile=/etc/asterisk/asterisk.pem
tlscafile=/etc/asterisk/cacert.crt
tlscadir=/etc/asterisk
tlsdontverifyserver=no

Por defecto SIPTLS utiliza el puerto 5061 TCP que hay que abrir en el firewall. El bloque register:

register => tls://servidora:sesamo@sip.servidorb.com:5061/servidorb

y en el bloque de las extensiones:

[servidorb]
type=friend
secret=sesamo
context=phones
qualify=yes
host=dynamic
language=es
transport=tls
port=5061
disallow=all
allow=ulaw

Por ultimo modificamos el dialplan:

nano extensions.conf

añadimos las siguientes líneas en el contexto internas:

exten => _300[1-9],1,Dial(SIP/servidorb/${EXTEN})
exten => _300[1-9],n,Hangup

Servidor B

Seguimos el mismo procedimiento para la generación y firma del certificado (Common Name: sip.servidorb.com)

En este caso no hace falta crear un único archivo para el certificado y la llave. Una vez tengamos nuestros certificados listos, configuramos el sip.conf:

nano sip.conf

realm=sip.servidorb.com

tlsenable=yes
tlsbindaddr=0.0.0.0
tlscertfile=/etc/asterisk/sip.servidorb.com.crt
tlsprivatekey=/etc7asterisk/sip.sipservidorb.com.key
tlscafile=/etc/asterisk/cacert.crt
tlscadir=/etc/asterisk
tlsdontverifyserver=no
tlsclientmethod=tlsv1

la línea de registro:

register => tls://servidorb:sesamo@sip.servidora.com:5061/servidora

y la extensión:

[servidora]
type=friend
secret=sesamo
context=phones
qualify=yes
host=dynamic
language=es
transport=tls
port=5061
disallow=all
allow=ulaw

Modificamos el dialplan:

nano extensions.conf

añadimos las siguientes líneas en el contexto internas:

exten => _100[1-9],1,Dial(SIP/servidora/${EXTEN})
exten => _100[1-9],n,Hangup

Ahora que hemos terminado con la configuración de ambos servidores, actualizamos la configuración de Asterisk (en los dos):

/etc/init.d/asterisk reload

Entramos en la consola de Asterisk del Servidor A y averiguamos que se haya registrado al servidorb:

asterisk –rv

CLI> sip show registry

Host                                         dnsmgr  Username       Refresh State                Reg.Time
sip.servidorb.com:5061        N      servidora             105 Registered           Sun, 07 Nov 2010 17:07:35

Ya podemos efectuar llamadas de un servidor a otro. Muy pronto veremos como conectar dos servidores Asterisk 1.8.0 con SIP-TLS y SRTP.