Asterisk настройка TLS SRTP для PJSIP

asterisk-pjsip-tls-srtp Настроим защищенное подключение SIP клиентов к Asterisk 14 за NAT, используя драйвер PJSIP, транспорт TLS и шифрование голоса SRTP.

См. также SIP TLS SRTP Asterisk

На входе у нас Asterisk 14 скомпилированный с поддержкой srtp:

 yum install  libsrtp libsrtp-devel
 ./configure --libdir=/usr/lib64 --with-crypto --with-ssl=ssl --with-srtp

Transport Layer Security (TLS) обеспечивает шифрование сигнализации SIP. Это способ защитить информацию о вызовах от man in the middle. SRTP обеспечивает шифрование голоса. Для настройки TLS между Asterisk и SIP клиентом требуется:

  1. Создать ключи шифрования.
  2. Настроить транспорт драйвера PJSIP для использования TLS.
  3. Настроить PJSIP Endpoint и SIP клиент для использования TLS и SRTP.

Убедитесь что модуль res_srtp.so загружен.

*CLI> module show like srtp
Module                         Description                              Use Count  Status      Support Level
res_srtp.so                    Secure RTP (SRTP)                        0          Running              core
1 modules loaded

Если нет, попытайтесь загрузить его:

*CLI> module load res_srtp.so
Loaded res_srtp.so
 Loaded res_srtp.so => (Secure RTP (SRTP))

Asterisk TLS keys

Сперва создадим само-подписанные сертификаты и ключи шифрования.

Создать директорию для ключей:

  mkdir /etc/asterisk/keys

С исходниками Asterisk поставляется скрипт для создания ключей:

  cd  /usr/src/asterisk-14*/contrib/scripts/

в моем случае, это Asterisk 14, но пойдет и 13, и м.б. 12. Выполните скрипт с тремя ключами:

./ast_tls_cert -C pbx.asterisk-pbx.ru -O "asterisk-pbx.ru" -d /etc/asterisk/keys
  • «-C» - укажите домен или ip адрес
  • «-O» - укажите имя
  • «-d» - директория для ключей

ast_tls_cert

ast_tls_cert

No config file specified, creating '/etc/asterisk/keys/tmp.cfg'
You can use this config file to create additional certs without
re-entering the information for the fields in the certificate
Creating CA key /etc/asterisk/keys/ca.key
Generating RSA private key, 4096 bit long modulus
..++
........................................................................................................................++
e is 65537 (0x10001)
Enter pass phrase for /etc/asterisk/keys/ca.key:
Verifying - Enter pass phrase for /etc/asterisk/keys/ca.key:
Creating CA certificate /etc/asterisk/keys/ca.crt
Enter pass phrase for /etc/asterisk/keys/ca.key:
Creating certificate /etc/asterisk/keys/asterisk.key
Generating RSA private key, 1024 bit long modulus
.++++++
.........++++++
e is 65537 (0x10001)
Creating signing request /etc/asterisk/keys/asterisk.csr
Creating certificate /etc/asterisk/keys/asterisk.crt
Signature ok
subject=/CN=pbx.asterisk-pbx.ru/O=asterisk-pbx.ru
Getting CA Private Key
Enter pass phrase for /etc/asterisk/keys/ca.key:
Combining key and crt into /etc/asterisk/keys/asterisk.pem

В ходе выполнения этой операции, вам будет предложено ввести секретную фразу и повторить ее два раза. Сохраните пароль, в дальнейшем он понадобится для генерации пользовательских сертификатов. В результате будут созданы следующие файлы и помещены в директорию заданную ключом 'd' :

  • asterisk.crt
  • asterisk.csr
  • asterisk.key
  • asterisk.pem
  • ca.cfg
  • ca.crt
  • ca.key
  • tmp.cfg

Далее создадим клиентский сертификат, все то же, только параметров побольше. Здесь понадобиться ввести ключевую фразу, заданную при создании сертификата сервера.

  ./ast_tls_cert -m client -c /etc/asterisk/keys/ca.crt -k /etc/asterisk/keys/ca.key -C pbx.asterisk-pbx.ru -O "asterisk-pbx.ru" -d /etc/asterisk/keys -o zvezdo4kin
  • «-m client» - получить клиентский сертификат.
  • «-c /etc/asterisk/keys/ca.crt» - указать наш же 'Certificate Authority'.
  • «-k /etc/asterisk/keys/ca.key» - указать ключ для 'Certificate Authority'.
  • «-C» - хост или ip адрес, те же, что и для сервера
  • «-O» - имя компании, то же что и для сервера.
  • «-d» - директория с ключами
  • «-o» - имя для клиентского сертификата.

В итоге получим такие файлы:

  • zvezdo4kin.crt
  • zvezdo4kin.csr
  • zvezdo4kin.key
  • zvezdo4kin.pem

Когда с сертификатами и ключами покончено, можно переходить к настройке Asterisk.

Asterisk TLS SRTP PJSIP

Создадим транспорт pjsip и пользовательcкий аккаунт.

/etc/asterisk/pjsip.conf

transport pjsip

[transport-tls]
type=transport
protocol=tls
bind=0.0.0.0:5066
cert_file=/etc/asterisk/keys/asterisk.crt
priv_key_file=/etc/asterisk/keys/asterisk.key
domain=pbx.asterisk-pbx.ru
external_media_address=123.123.123.111
external_signaling_address=123.123.123.111
local_net=192.168.0.0/16
method=tlsv1
allow_reload=true

Специфические настройки транспорта для TLS налицо:

  • protocol=tls
  • cert_file=/etc/asterisk/keys/asterisk.crt
  • priv_key_file=/etc/asterisk/keys/asterisk.key
  • method=tlsv1

Сервер находится за NAT, поэтому укажем внешний медиа и сигнальный адрес:

  • external_media_address=123.123.123.111
  • external_signaling_address=123.123.123.111

Будем работать по порту 5066

  • bind=0.0.0.0:5066

На шлюзе/роутере пробросьте диапазон портов RTP (tcp и udp) и сигнальный порт 5066 (tcp и udp)

pjsip endpoint, aor, auth

[zvezdo4kin]
type=aor
max_contacts=1
remove_existing=yes

[zvezdo4kin]
type=auth
auth_type=userpass
username=zvezdo4kin
password=mypassword

[zvezdo4kin]
type=endpoint
transport=transport-tls
direct_media=no
aors=zvezdo4kin
auth=zvezdo4kin
context=from-zvezdo4kin
dtls_cert_file=/etc/asterisk/keys/zvezdo4kin.crt
dtls_private_key=/etc/asterisk/keys/zvezdo4kin.key
disallow=all
allow=opus
allow=alaw
allow=ulaw

force_rport=yes
ice_support=yes
rewrite_contact=yes

dtmf_mode=rfc4733
media_encryption=sdes

В параметрах ENDPOINT пользовательского аккаунта зададим метод шифрования голоса:

  • media_encryption=sdes

Применим настройки рестартом asterisk (иначе транспорт не поднять) и убедимся, что он взлетел:

*CLI> pjsip show transport transport-tls

Transport:  <TransportId........>  <Type>  <cos>  <tos>  <BindAddress....................>
==========================================================================================

Transport:  transport-tls             tls      0      0  0.0.0.0:5066

 ParameterName              : ParameterValue
 ============================================================
 allow_reload               : false
 async_operations           : 1
 bind                       : 0.0.0.0:5066
 ca_list_file               :
 ca_list_path               :
 cert_file                  : /etc/asterisk/keys/asterisk.crt
 cipher                     :
 cos                        : 0
 domain                     : pbx.asterisk-pbx.ru
 external_media_address     : 123.123.123.111
 external_signaling_address : 123.123.123.111
 external_signaling_port    : 0
 local_net                  : 192.168.0.0/255.255.0.0
 method                     : tlsv1
 password                   :
 priv_key_file              : /etc/asterisk/keys/asterisk.key
 protocol                   : tls
 require_client_cert        : No
 tos                        : 0
 verify_client              : No
 verify_server              : No
 websocket_write_timeout    : 100

В дальнейшем, изменения в настройках транспорта, можно будет применять командой core reload, если при настройке транспорта указать allow_reload=true, иначе, по умолчанию, только рестартом.

Теперь осталось, только настроить SIP клиент.

Asterisk TLS SRTP SIP клиент

Софтфон Zoiper прекрасно работает с SRTP, как в десктопном, так и мобильном варианте на Android. Для iPhone хорошо себя зарекомендовала Bria.

Zoiper > Preference > Accounts > General
Стандартные настройки авторизации SIP

asterisk-pjsip-zoiper-tls-srtp

Zoiper > Preference > Accounts > Advanced

  • Use Rport - включить
  • Use Rport Media - включить
  • Use TLS Transport - выбрать
  • TLS with SDES SRTP - выбрать

Tls Client Certificate
Предварительно скопируйте сертификаты в доступную smb директорию

  • Certificate File - пользовательский сертификат 'user.pem'
  • Use sertificate As - Use Certificate

asterisk-pjsip-zoiper-tls-srtp-advanced

Zoiper > Preference > Advanced > Security
TLS options:

  • Extra CA Certificate (PEM) - пользовательский сертификат 'user.pem'
  • Local Domain Certificate - включить и загрузить 'asterisk.pem'
  • Disable Certificate Verification - включить

Страшная надпись предупреждает об опасности: DANGEROUS! DO NOT USE!
Но так как, мы используем само-подписанный сертификат, если не выключить верификацию, то ркгистрация не удастся. Нас предупреждают о опасности использования не удостоверенных доверенным издателем сертификатов, так же как браузер предупреждает, что сайт использует self-signed сертификат.

  • Protocol Suite - TLS v1

asterisk-pjsip-zoiper-tls-srtp-preference-advanced

Когда регистрация успешно завершена, сделаем звонок. Иконка с закрытым замком указывает на защищенное соединение.

zoiper call encrypted srtp tls

Тестирование

Хорошо бы еще убедиться, что сигнализация и голос зашифрованы. Это можно сделать при помощи приложения tcpdump

для сигнализации:

  tcpdump -nqt -s 0 -A -vvv -i eth0 port 5061

где eth0 сетевой интерфейс.

Для голоса:

  tcpdump -nqt -s 0 -A -vvv -i eth0 portrange 10000-20000

Настройка Asterisk

  • asterisk/pjsip-tls-srtp.txt
  • Последние изменения: 2018/10/23