Asterisk настройка TLS SRTP для PJSIP
Настроим защищенное подключение 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 клиентом требуется:
- Создать ключи шифрования.
- Настроить транспорт драйвера PJSIP для использования TLS.
- Настроить 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» - директория для ключей
В ходе выполнения этой операции, вам будет предложено ввести секретную фразу и повторить ее два раза. Сохраните пароль, в дальнейшем он понадобится для генерации пользовательских сертификатов. В результате будут созданы следующие файлы и помещены в директорию заданную ключом '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
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
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
Когда регистрация успешно завершена, сделаем звонок. Иконка с закрытым замком указывает на защищенное соединение.
Тестирование
Хорошо бы еще убедиться, что сигнализация и голос зашифрованы. Это можно сделать при помощи приложения tcpdump
для сигнализации:
tcpdump -nqt -s 0 -A -vvv -i eth0 port 5061
где eth0 сетевой интерфейс.
Для голоса:
tcpdump -nqt -s 0 -A -vvv -i eth0 portrange 10000-20000