Setting up FreeSWITCH WebRTC functionality
This tutorial will go over how to setup WebRTC on FreeSWITCH using a certificate from letsencrypt. WebRTC is a protocol which allows voip calls to be conducted over a web browser without additional plugins or software. This tutorial will assume you are Debian 8, which is the recommended OS for production FreeSWTICH servers.
FreeSWITCH WebRTC encryption using letsencrypt
We will use letsencrypt to create tls certificates for our FreeSWITCH server and automate the renewal. WebRTC requires a valid tls certificate for security purposes, and letsencrypt is a cheap and easy way to obtain one.
echo "deb http://ftp.debian.org/debian jessie-backports main" >> /etc/sources.list
apt update && apt upgrade
apt install certbot -t jessie-backports
apt install apache2
You should now have the certbot
package installed, and apache2 installed with the default configuration of /var/www/html
as your root directory.
You will also want to update /etc/hosts
and /etc/hostname
to reflect the domain name you will be using.
in /etc/hosts
append your hostname to the end of the 127.0.1.1
line
127.0.1.1 <somedomain-name>
and in /etc/hostname
replace the current name with your hostname.
<somedomain-name>
Next, we will create our certificate. Execute the following command and fill out any necessary fields.
certbot certonly --webroot -w /var/www/html/ -d <somehostname>
You should see the following if it was successful.
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/pbx.somedomain.com/fullchain.pem. Your cert
will expire on 2017-04-11. To obtain a new or tweaked version of
this certificate in the future, simply run certbot again. To
non-interactively renew *all* of your certificates, run "certbot
renew"
- If you lose your account credentials, you can recover through
e-mails sent to root@pbx.somedomain.com.
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Next, we need to setup the auto renewal with cron
. These certificates expire every 90 days, and by default the certbot
application will renew the certificate if it is within 30 days of expiring. I chose to run the command every week to be safe.
crontab -e
0 0 * * 7 certbot renew
Configuring SSL for HTTP
Since we are using SSL for WebRTC, might as well use the certificate to enable HTTPS on our server as well.
We need to enable the SSL module for Apache2. On Debian, you can issue this command.
sudo a2enmod ssl
Next we need to create a virtual host in /etc/apache2/sites-available/
. Create a file named your new domain name in /conf
vim /etc/apache2/sites-available/pbx.somedomain.com.conf
Then include the following configuration. Note, you will need to point the SSL certificates to the correct directory depending on your domain. You will also need to change the ServerName
parameter to whatever your domain name is.
<VirtualHost *:443>
ServerName somedomain-name
DocumentRoot /var/www/html
SSLEngine on
SSLProtocol all -SSLv3 -SSLv3
SSLCompression off
SSLHonorCipherOrder On
SSLCipherSuite EECDH+AESGCM:EECDH+AES:EDH+AES
SSLCertificateFile /etc/letsencrypt/live/pbx.somedomain.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/pbx.somedomain.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/pbx.somedomain.com/chain.pem
ServerAdmin some-email@address.com
ErrorLog ${APACHE_LOG_DIR}/error-devel.log
CustomLog ${APACHE_LOG_DIR}/access-devel.log combined
DirectoryIndex index.html
</VirtualHost>
Enable the new virtual host with a2ensite pbx.somedomain.com.conf
. This will create a symlink from sites-available
to sites-enabled
. Then Restart Apache2 to enable these changes with systemctl restart apache2
.
Installing FreeSWITCH
I chose to use the repository maintained by FreeSWITCH to simplify updates, but you can also compile from source if you wish. If you compiled from source, the FreeSWTICH configuration will be in /usr/local/freeswitch/conf/
instead of inside /etc/
.
Use the following commands to setup the FreeSWITCH official repo and install the FreeSWITCH packages on Debian 8.
wget -O - https://files.freeswitch.org/repo/deb/debian/freeswitch_archive_g0.pub | apt-key add -
echo "deb http://files.freeswitch.org/repo/deb/freeswitch-1.6/ jessie main" > /etc/apt/sources.list.d/freeswitch.list
apt-get update && apt-get install -y freeswitch-meta-all git
We are going to want the source files later to copy over the verto js demo.
cd /usr/local/src/
git clone https://freeswitch.org/stash/scm/fs/freeswitch.git -bv1.6 freeswitch
Installing the java script dependencies for the verto demo.
This will install npm
and other dependencies for the verto demo to run.
apt update
apt install npm nodejs-legacy
npm install -g grunt grunt-cli bower
npm install
bower --allow-root install
grunt build
Configuring FreeSWTICH
We are going to use the letsencrypt tls certificate we installed earlier for WebRTC. A combined key needs to be created from fullchain.pem
and privkey.pem
.
cat /etc/letsencrypt/live/somedomain.com/fullchain.pem /etc/letsencrypt/live/somedomain.com/privkey.pem > /etc/freeswitch/tls/wss.pem
Some changes will need to be made to the /etc/freeswitch/autoload_configs/verto.conf.xml
file. I removed the ipv6 profile for simplicity.
<configuration name="verto.conf" description="HTML5 Verto Endpoint">
<settings>
<param name="debug" value="10"/>
<!-- seconds to wait before hanging up a disconnected channel -->
<!-- <param name="detach-timeout-sec" value="120"/> -->
<!-- enable broadcasting all FreeSWITCH events in Verto -->
<!-- <param name="enable-fs-events" value="false"/> -->
<!-- enable broadcasting FreeSWITCH presence events in Verto -->
<!-- <param name="enable-presence" value="true"/> -->
</settings>
<profiles>
<profile name="somedomain">
<param name="bind-local" value="0.0.0.0:8081"/>
<param name="bind-local" value="0.0.0.0:8082" secure="true"/>
<param name="force-register-domain" value="$${domain}"/>
<param name="secure-combined" value="/etc/freeswitch/tls/wss.pem"/>
<param name="secure-chain" value="/etc/freeswitch/tls/wss.pem"/>
<param name="userauth" value="true"/>
<param name="context" value="public"/>
<param name="dialplan" value="XML"/>
<!-- setting this to true will allow anyone to register even with no account so use with care -->
<param name="blind-reg" value="false"/>
<param name="mcast-ip" value="224.1.1.1"/>
<param name="mcast-port" value="1337"/>
<param name="rtp-ip" value="$${local_ip_v4}"/>
<!-- <param name="ext-rtp-ip" value=""/> -->
<param name="local-network" value="localnet.auto"/>
<param name="outbound-codec-string" value="opus,vp8"/>
<param name="inbound-codec-string" value="opus,vp8"/>
<param name="apply-candidate-acl" value="localnet.auto"/>
<param name="apply-candidate-acl" value="wan_v4.auto"/>
<param name="apply-candidate-acl" value="rfc1918.auto"/>
<param name="apply-candidate-acl" value="any_v4.auto"/>
<param name="timer-name" value="soft"/>
</profile>
</profiles>
</configuration>
Uncomment the following line in /etc/freeswitch/directory/default.xml
, or whatever directory you would like to be able to use mod_verto
for WebRTC.
<param name="jsonrpc-allowed-event-channels" value="demo,conference,presence"/>
Now we can copy over the demo verto client to our web server directory
cp -r /usr/local/src/freeswitch/html5/verto/demo/ /var/www/html/
chown -R www-data:www-data /var/www/html/
You should now be able to go to https://<your-domain-name>/demo
and you will see the demo WebRTC interface. By default, this client will register to your FreeSWITCH server as extension 1008 with the default password. Because we are registered as a user in the Default directory, our calls will be processed by the default context. You can add some dialplan to test the setup in /etc/freeswitch/dialplan/default/
Such as the following (replace the playback data with the path to a sound file to play back. When dialing 12345, you should hear the audio file played back.)
<include>
<extension name="verto_test">
<condition field="destination_number" expression="^(12345)$">
<action application="answer"/>
<action application="log" data="INFO ********* VERTO WEBRTC CALL *******" />
<action application="playback" data="path-to-some-sound-file.wav"/>
<action application="hangup" />
</condition>
</extension>
</include>