Asterisk webrtc let’s encrypt WSS websocket server

Per iniziare semplificando i concetti, per poi addentrarci in una spiegazione più tecnica, questo articolo spiega come attivare un telefono IP software all’interno di una pagina web e far si che si registri su di una centrale telefonica remota attraverso internet, questo consentirà a chi aprirà la pagina di utilizzare il PBX remoto esattamente come fosse un interno locale.

Questo tipo di configurazione asterisk webrtc può dar vita a:

  • un sistema di call-center senza costi di linee telefoniche ( ad esempio per fornire supporto in acquisto agli acquirenti ,real time , in un e-commerce)
  • servizi di acquisizione letture per utility gas-luce-energia come quello attivato nel buttone posto nel link ad inzio articolo
  • effettuare una telefonata ad un qualsiasi interno (o numero esterno perchè no? ) come se si fosse nella rete di appartenenza del centralino.
  • qualsiasi cosa vi venga in mente per consentire agli utenti della vostra pagina di comunicare con voi o con i vostri servizi automatici

Asterisk e webrtc mettono un vero e proprio telefono nella vostra pagina web collegato al vostro centralino telefonico

Asterisk webrtc let's encrypt WSS websocket server

Vai qui per visitare la pagina che integra il progetto e clicca su apri per far apparire in finestra il telefono software ( previo assenso di condivisione/utilizzo del microfono).

Asterisk ormai dalla versione 11 supporta webrtc e le connessioni real time tramite browser, e, dalla versione 13,  lo sviluppo appare maturo e testabile, con tutte le cautele, in produzione. Supportare webrtc significa consentire ad  un client SIP remoto di utilizzare il websocket come mezzo di trasmissione per instaurare una connessione cifrata (TLS)  al vostro centralino Asterisk.

 

In questo tutorial  andremo ad effettuare:

  •  installazione Centos 7
  • Asterisk 13 con supporto TLS – webrtc
  • creazione e configurazione di un certificato SSL da https://letsencrypt.org/ per l’utilizzo (obbligatorio ) di una connessione sicura WSS.

 

Quando utilizziamo WSS come protocollo di trasporto Chrome e Firefox di default non consentiranno la connessione ad un server remoto mediante un certificato auto-firmato (come si trova spiegato nella maggior parte dei tutorial) , noi opteremo quindi per un certificato SSL riconosciuto internazionalmente Let’s Encrypt.

La configurazione di un sistema del genere presuppone un livello di conoscenze almeno di medio livello sia per Linux CentOS che Asterisk, per cui di alcuni passaggi si forniranno solamente link informativi per il loro espletamento.

Per l’installazione di Centos 7 non si forniranno spiegazioni particolari, usate un metodo qualsiasi che vi consenta di collegarvi ad internet, installare pacchetti e modificare file di configurazione ,  per quella di  Asterisk con supporto webrtc si rimanda ai seguenti links, ricordando che è assolutamente necessario (per il proseguio)  avere una connessione internet  con IP Statico, un dominio registrato su  quell’IP (che punti al vostro indirizzo quindi,  anche solo attraverso un DNS dinamico) e l’apertura delle porte necessarie alle registrazioni SIP e  all’utilizzo del protocollo HTTP, HTTPS , WS e WSS.
Durante la compilazione di Asterisk con  menuselect verficare che sia presente :
  • res_http_websocket perchè è il modulo creato per consentire alle librerie javascript di interagire e comunicare con asterisk
  • res_crypto per le comunicazioni SSL
  • chan_sip per ovvie ragioni
altrimenti verificare bene le dipendenze e far riferimento a San Google per ogni problematica.
==================================================================
Per l’installazione del certificato SSL firmato :
unica nota è quella di aprire, anche solo temporaneamente le porte HTTP e HTTPS (80 e 443),  per consentire all’utility CERTBOT di poter verificare che il servizio APACHE sia in ascolto sulle suddette porte e  stia effettivamente servendo il dominio per il quale si sta richiedendo il certificato.
L’utility CERTBOT genererà i seguenti files :
cert.pem
chain.pem
fullchain.pem
privkey.pem
che andranno copiati in /etc/asterisk/keys/ verificando eventualmente i permessi di lettura.
============================================================================
La configurazione del file http.conf del  “Built-IN Http Server” in Asterisk per l’utilizzo dei suddetti certificati per l’instaurazione di una connessione cifrata  dovrà contenere:
——————————————
[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088
tlsenable=yes
tlsbindaddr=0.0.0.0:8089
tlscertfile=/etc/asterisk/keys/fullchain.pem
tlsprivatekey=/etc/asterisk/keys/privkey.pem
——————————————————
Il file sip.conf:
[general]
udpbindaddr=0.0.0.0:5060
realm= <il vostro ip pubblico>
transport=tcp,udp,ws,wss
tlsclientmethod=ALL
tlscipher=ALL
nat=yes
[6000]
host=dynamic
secret=password
context=interni
type=peer
encryption=yes
avpf=yes
icesupport=yes
directmedia=no
rtcp_mux=yes
transport=ws,wss,udp
directmedia=no
disallow=all
allow=ulaw,opus,vp8,h264
nat=yesdtlsenable=yes
dtlssetup=actpassdtlscertfile=/etc/asterisk/keys/fullchain.pem
dtlsprivatekey=/etc/asterisk/keys/privkey.pem

[6002]
host=dynamic
secret=6002
context=interni
type=peer
transport=ws,wss,udp
directmedia=no
disallow=all
allow=all

dove 6000 è il vostro interno webrtc a cui vi collegherete da remoto e 6002 un interno standard locale.
====================================================
Da console in caso di configurazione corretta dovremmo avere :

Connected to Asterisk 13.23.0 currently running on localhost (pid = 1212)
localhost*CLI> http show status
HTTP Server Status:
Prefix:
Server: Asterisk/13.23.0
Server Enabled and Bound to 0.0.0.0:8088

HTTPS Server Enabled and Bound to 0.0.0.0:8089

Enabled URI’s:
/httpstatus => Asterisk HTTP General Status
/phoneprov/… => Asterisk HTTP Phone Provisioning Tool
/static/… => Asterisk HTTP Static Delivery
/ari/… => Asterisk RESTful API
/ws => Asterisk HTTP WebSocket

Enabled Redirects:
None.

 

Indispensabile per prevenire le eventuali problematiche di connettività dovute a firewall, NAT e simili , la configurazione del protocollo ICE, che utilizza server STUN e/o TURN a cui si rimanda al link per comprensione, ed è un’addon alle API del motore RTP che offre un’interaccia per il suo utilizzo all’interno della sessione RTP.

 

Il supporto per l’utilizzo del protocollo ICE si abilita in rtp.conf di cui sotto è fornito un esempio,

================================================

[root@localhost asterisk]# cat rtp.conf
[general]
rtpstart=10000
rtpend=10255
icesupport=yes
stunaddr=stun.l.google.com:19302

=================================================

All’interno di res_stun_monitor.conf aggiungere o sostituire la riga che definisce l’indirizzo di un server STUN.

stunaddr = stun.l.google.com:19302

=========================================================

Per verificare la corretta configurazione si può digitare dalla console di Asterisk ->  stun show status

 

[root@localhost asterisk]# asterisk -r

Connected to Asterisk 13.23.0 currently running on localhost (pid = 1381)
localhost*CLI> stun show status
Hostname Port Period Retries Status ExternAddr ExternPort
stun.l.google.com 19302 30 3 OK 185.226.5.23 47829

==================================================================
Se tutto è filato liscio si potrà utilizzare uno dei tanti progetti che utilizzano la libreria javascript sip.js,  per implementare un endpoint SIP (telefono) in una pagina web ed effettuare dei test di connessione e comunicazione
Nella pagina di questo sito https://www.pcbackup.it/ctxsip/ si è utilizzato
https://github.com/collecttix/ctxSip ma si può tranquillamente provare anche il più famoso SIPml5  https://www.doubango.org/sipml5/ oppure https://sipjs.com/