SSL защита подключений к Asterisk (Let's encrypt)


 

Большая инструкция по настройке безопасных звонков (с использованием криптозащиты соединения) имеется на официальном сайте Asterisk: https://wiki.asterisk.org/wiki/display/AST/Secure+Calling+Tutorial, в данной статье рассматривается метод защиты соедеиенения с использованием самоподписанных серверного и клиентского сертификатов. Клиентский сертификат поддерживается мягко говоря не всеми софтфонами не говоря уже о аппаратных VOIP-телефонах (а если и поддерживается, то могут быть нюансы).

В рамках цикла статей по настройке FreePBX я сейчас расскажу как настроить защиту соединения применительно именно к FreePBX, а в дальнейшем уже рассмотрим защиту соединения применительно к чистому Asterisk (когда с циклом по FreePBX закончим и у вас появится некоторый опыт работы с IP-телефонией).

Настройки FreePBX для защиты обмена данными по протоколу PJSIP выглядят следующим образом.

Соотвественно нам необходимо задать файлы сертификатов и ключи которые будут использоваться при шифровании трафика, выбрать режим SSL и обеспечить проверку сервера и клиента (или проверять опционально). Начнем с генерации сертификата который мы будем использовать для теста работоспособности шифрования. FreePBX довольно дружелюбная система (именно поэтому мы с нее и начали) и генерировать сертификаты мы можем при помощи специального плагина с одноименным наименованием.

Установите плагин если он у вас еще не установлен и переходите в раздел Admin -> Certificate manager.

Как вы наверное догадались, нам сейчас потребуется удалить самоподписанный сертификат и создать сертификат Let's encrypt.

Указываем имя хоста, адрес электронной почты и т.п.

Если вы уже используете сертификат от Let's encrypt для зашиты Nginx, то вы можете использовать обходной маневр, и создать самоподписанный сертификат на этот же хост, но потом подменить его сертификатом от Let's encrypt уже установленным в системе.

После того как мы подготовили наш валидный или самоподписанный сертификат мы переходим в настройки PJSIP протокола Settings -> Asterisk SIP Settings -> PJSIP. Как вы наверное догадались мы теперь просто выбираем сертификат созданный в Cert Manager.

 

Применение параметров TLS-соединения требует парезапуска демона Asterisk:

# /etc/init.d/asterisk restart

Механизм проверки TLS-соединения я подробно описывал в статье "Настройка шифрования трафика протоколов SMTP и IMAP сертификатами let's Encrypt (EXIM+Dovecot)". И вот таким образом выглядит подключение с использованием самоподписанного сертификата:

$ openssl s_client -connect pbx.gita-dev.ru:5061 -tls1 -servername pbx.gita-dev.ru
CONNECTED(00000003)
depth=0 CN = pbx.gita-dev.ru, O = GITA-DEV
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = pbx.gita-dev.ru, O = GITA-DEV
verify return:1
---
Certificate chain
 0 s:/CN=pbx.gita-dev.ru/O=GITA-DEV
  i:/CN=pbx.gita-dev.ru/O=GITA-DEV

И соответственно использование валидного сертификата от Let's encrypt:

$ openssl s_client -connect pbx.gita-dev.ru:5061 -tls1 -servername pbx.gita-dev.ru
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = pbx.gita-dev.ru
verify return:1
---
Certificate chain
 0 s:/CN=pbx.gita-dev.ru
  i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
  i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---

Подменить самоподписанный сертификат реальным сертификатом Let's encrypt можно следующими командами:

# cat /etc/letsencrypt/live/pbx.gita-dev.ru/privkey.pem > /etc/asterisk/keys/pbx.gita-dev.ru.key
# cat /etc/letsencrypt/live/pbx.gita-dev.ru/cert.pem > /etc/asterisk/keys/pbx.gita-dev.ru.crt
# cat /etc/letsencrypt/live/pbx.gita-dev.ru/fullchain.pem > /etc/asterisk/keys/pbx.gita-dev.ru.pem

И лучше сделать сделать символические ссылки к реальным обновляемым сертификатам Let's encrypt чем городить такие костыли. Теперь нам остается лишь проверить как это будет работать в реальных условиях при помощи любого программного телефона с поддержкой TLS.