Обзор протокола SIP-TLS: настройка сертификатов и проверка совместимости клиентов

Когда вы настраиваете телефонную систему, фраза «настроим SIP-TLS» часто звучит как магическое заклинание безопасности. Но на практике это место, где администраторы чаще всего сталкиваются с «невозможными» ошибками. Звонок не идет, телефон пишет «Registration Failed», а логи сервера молчат или сыплют непонятными кодами.

Суть проблемы не в том, что протокол сложен. Суть в том, что TLS — это строгий механизм проверки личности. Он не прощает, если что-то написано с ошибкой в сертификате, если время на сервере рассинхронизировано или если клиент (телефон) не доверяет тому, кто выдал сертификат.

В этой статье я разберу процесс настройки SIP-TLS не как теоретик, а как инженер, который уже настраивал его на сотнях серверов. Мы пройдем путь от генерации сертификата до проверки того, что ваши телефоны действительно шифруют разговор, а не просто пытаются подключиться.

Зачем вам вообще нужен SIP-TLS? Без воды

Давайте сразу разберемся с мотивацией. Вы не настраиваете шифрование просто для галочки. У вас есть две конкретные причины, по которым вы здесь:

  1. Вам нужно скрыть сигнализацию. Без шифрования (обычный SIP) ваш компьютер в интернете видит все ваши звонки: кто кому звонит, когда, с какого номера и на какой. Перехватить этот трафик в публичной Wi-Fi сети или на уровне провайдера — дело нескольких минут. SIP-TLS шифрует заголовки и само тело сообщения (SIP), делая его бесполезным для перехватчика.
  2. Вам нужно защитить от подмены. Злоумышленник может прислать вашему телефону фальшивый сигнал, чтобы тот позвонил куда-то не туда или, что хуже, принял звонок от мошенника, выдающего себя за руководителя.

Важно понимать разницу: SIP-TLS шифрует сигнализацию. Он не шифрует голос. Для голоса используется протокол SRTP (Secure Real-Time Protocol). Обычно SIP-TLS и SRTP ходят в паре. Если вы настроили TLS, но забыли про SRTP, ваши звонки будут защищены от подмены, но голос все еще может быть перехвачен в открытом виде. В этой статье мы сосредоточимся именно на части SIP-TLS, так как без неё SRTP часто вообще не сможет подключиться.

Как устроена проверка «доверия»

В основе всей этой системы лежит механизм сертификатов. Представьте, что сертификат — это паспорт. Когда ваш телефон (клиент) хочет соединиться с сервером Астериски или FreeSWITCH, сервер показывает ему свой паспорт (сертификат).

Телефон проверяет три вещи:

  • Подлинность печати. Выдан ли этот паспорт доверенным органом (CA)?
  • Срок действия. Не истек ли паспорт? Не началось ли время раньше, чем сейчас?
  • Имя владельца. Написано ли в паспорте то имя, которое мы ищем? Если телефон звонит на sip:10.0.0.1, а в сертификате написано server.example.com, соединение разорвется.

Если вы настраиваете сервер для внутренней сети, вам не обязательно покупать дорогие сертификаты у GlobalSign или DigiCert. Вы можете создать свой собственный центр сертификации (Self-Signed CA). Это бесплатно и надежно, но требует ручной установки корневых сертификатов на все телефоны. Если же телефоны разбросаны по разным офисам и провайдерам, проще купить публичный сертификат.

Генерация сертификатов: шаг за шагом

Давайте перейдем к практике. Допустим, у нас есть сервер на базе Linux (Ubuntu/CentOS) с установленным Asterisk или FreeSWITCH. Нам нужен ключ и сертификат.

Самый надежный способ — использовать OpenSSL. Не используйте готовые скрипты «одной кнопкой», если вы не понимаете, что они делают. Лучше создайте собственную структуру файлов.

Этап 1. Создание приватного ключа

Сначала генерируем ключ. Это самая важная часть. Если вы потеряете этот файл, ваш сертификат станет бесполезным. Храните его в защищенной директории, например, /etc/asterisk/keys.

openssl genrsa -aes256 -out server.key 4096

Команда создаст файл server.key с длиной ключа 4096 бит. Этот размер сейчас считается стандартом надежности. Аргумент -aes256 зашифрует сам файл ключа паролем. Пароль нужно будет вводить при запуске сервера (или прописать в конфиге, если это безопасно).

Этап 2. Создание запроса сертификата (CSR)

Теперь создаем запрос. Здесь нужно быть предельно внимательным. В системе придет сертификат, и в нем должны быть указаны правильные данные.

openssl req -new -key server.key -out server.csr

Вас попросят ввести данные. Вот здесь кроется самая частая ошибка. Поле Common Name (CN) должно совпадать с тем адресом, по которому телефон будет искать сервер.

  • Если вы подключаетесь по домену: CN = sip.mycompany.com
  • Если вы подключаетесь по IP: CN = 192.168.1.50
  • Никогда не ставьте в CN localhost или asterisk, если вы подключаетесь извне. Телефон не найдет совпадения.

Поле Subject Alternative Name (SAN) — это критически важный параметр для современных систем. Многие телефоны (особенно Yealink, Fanvil) игнорируют Common Name, если не находят его в SAN. В запросе его можно указать, но проще добавить это в конфигурацию при использовании CA (Certificate Authority).

Этап 3. Подписание сертификата (Self-Signed)

Если вы хотите выпустить сертификат сами, выполните команду для подписи:

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Это создаст файл server.crt сроком действия на год. Для продакшена лучше ставить 1-2 года, но не больше. Слишком долго действующие сертификаты — это риск безопасности.

Важно про SAN: Если вы используете OpenSSL версии 1.1.1+, создание сертификата с SAN через простую команду может быть неочевидным. Часто проще создать файл конфигурации openssl.cnf:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
CN = sip.mycompany.com
O = My Company

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = sip.mycompany.com
IP.1 = 192.168.1.50

Затем использовать этот файл при генерации. Это гарантирует, что телефон увидит и домен, и IP-адрес.

Настройка сервера (Asterisk / FreeSWITCH)

После того как у вас есть файлы server.crt и server.key, нужно заставить сервер их использовать.

В Asterisk это делается в файле pjsip.conf или pjsip_wizard.conf (для новых версий). Вам нужно настроить секцию [transport-tls].

[transport-tls]
type=transport
protocol=tls
bind=0.0.0.0:5061
ca_file=/etc/asterisk/keys/ca.crt
cert_file=/etc/asterisk/keys/server.crt
private_key_file=/etc/asterisk/keys/server.key
tls_verify_client=no
method=tlsv1_2

Обратите внимание на bind=0.0.0.0:5061. Стандартный порт для SIP-TLS — 5061. Не пытайтесь запускать TLS на порту 5060 (там живет обычный SIP), если только вы не настроили сложный мультиплексинг, который создает проблемы с NAT.

Параметр method=tlsv1_2 важен. TLS 1.0 и 1.1 сейчас устарели и небезопасны. Многие современные телефоны (особенно новые прошивки Yealink) могут отклонять соединения на старых версиях протокола. Принудительное включение TLS 1.2 — это хороший тон.

После изменения конфига не забудьте перезагрузить транспорт: core restart now или pjsip reload.

Настройка клиента: телефоны и софтфоны

Сервер настроен. Теперь нужно заставить телефон доверять серверу. Здесь кроется 90% проблем.

Настройка телефона зависит от модели, но логика везде одна:

  1. Активируйте шифрование (Transport = TLS).
  2. Укажите порт 5061.
  3. Укажите сервер (SIP Server/Proxy).
  4. Загрузите сертификат.

Если вы используете самоподписанный сертификат (Self-Signed), телефон не поймет, кому доверять. Он увидит сертификат, выпущенный «Никем» (так как вы его сами подписали). У вас есть два пути:

Путь 1. «Слепое доверие» (Accept Invalid Certificates).
На многих телефонах есть галочка «Accept Invalid Certs» или «Ignore TLS Errors». Если вы её нажмете, телефон пропустит проверку. Соединение установится, но вы потеряете смысл безопасности. Вас может перехватить человек посередине (Man-in-the-Middle), и телефон об этом не сообщит. Это допустимо только в закрытой тестовой сети.

Путь 2. Установка корневого сертификата (CA).
Это правильный путь. Вы должны взять файл ca.crt (или ваш server.crt, так как он сам по себе является корнем при Self-Signed) и загрузить его в память телефона.
В меню телефона это обычно: Administration -> Certificates -> Import. После загрузки телефон начнет видеть ваш сертификат как «доверенный».

Если вы используете публичный сертификат (например, Let’s Encrypt), телефон автоматически доверяет ему, так как доверие к Let’s Encrypt встроено в прошивки всех современных телефонов. Это самый простой вариант для разворачивания инфраструктуры.

Сравнение подходов к сертификатам

Чтобы помочь вам принять решение, давайте сравним три основных сценария использования сертификатов. Выбор зависит от масштаба вашей сети и бюджета.

Тип сертификата Где уместен Сложность настройки Безопасность Минусы
Self-Signed (Самодельный) Офисная сеть, 10-50 телефонов, закрытая среда. Средняя (нужно вручную грузить CA на каждый телефон). Высокая (если настроен правильно). Трудно масштабировать. Нужно обновлять на всех устройствах при истечении срока.
Let’s Encrypt / Public CA Удаленные офисы, работа из дома, публичные IP. Низкая (автоматическое обновление). Высокая. Требует публичного IP или DNS доступа. Бесплатные сертификаты имеют срок 90 дней (нужен автообновляемый скрипт).
Корпоративный CA (Active Directory) Крупные компании с доменом Windows. Низкая (распространяется через GPO). Высокая. Сложная инфраструктура. Требует сервера AD CS.

Для малых и средних компаний я обычно рекомендую Let’s Encrypt. Это снимает головную боль с ручной установкой сертификатов на каждый телефон. Если телефон не доверяет Let’s Encrypt — это проблема прошивки телефона (слишком старая), которую нужно решать обновлением.

Диагностика: как проверить, что всё работает

Вы нажали «Сохранить» в телефоне, и он пишет «Registered». Но работает ли шифрование? Не стоит верить слепо статусу.

Просмотр логов

Зайдите в консоль сервера. В Asterisk это pjsip set logger on. Посмотрите на поток данных. Если вы видите строки вроде Received TLS connection from... и Encrypted, значит, сигнализация идет через TLS.

Ищите фразы Transport TLS. Если вы видите Transport UDP, значит, телефон подключился по старому протоколу. Это часто случается, если вы настроили телефон на TLS, но забыли открыть порт 5061 на фаерволе.

Сниффинг трафика (Wireshark)

Это «золотой стандарт» проверки. Скачайте Wireshark, запустите захват на сетевом интерфейсе и сделайте звонок.

  • Если SIP-TLS работает: Вы увидите поток TCP на порт 5061. Внутри пакетов будет «TLSv1.2 Application Data». Вы не сможете прочитать содержимое пакетов (SIP-заголовки, номера, логины). Всё будет выглядеть как мусор.
  • Если не работает: Вы увидите пакеты SIP в открытом виде. Вы сможете прочитать заголовок INVITE, логины и пароли. Даже если телефон пишет «Secure», трафик идет в открытом виде.

Частые ошибки и как их избежать

Я собрал список проблем, с которыми сталкиваются чаще всего. Если у вас не работает, проверьте этот чек-лист.

1. Несовпадение Common Name (CN) и адреса подключения.
Телефон звонит на IP 192.168.1.10, а в сертификате написано pbx.local. Телефон проверяет: «Я звоню на 10, а паспорт выдан на pbx.local. Это мошенник!». И сбрасывает соединение.
Решение: Убедитесь, что в поле CN или SAN указан именно тот адрес, который введен в настройках телефона.

2. Проблемы с NAT и портом.
SIP-TLS работает поверх TCP. В отличие от UDP, TCP требует установления соединения (Handshake). Если у вас стоит NAT (шлюз), он может «забыть» о соединении, если оно долго бездействует.
Решение: Включите «Keep Alive» (пробросы SIP OPTIONS или пустых пакетов) на телефоне с интервалом 30-60 секунд. Это держит TCP-канал активным.

3. Устаревшие алгоритмы шифрования.
Вы сгенерировали сертификат, а телефон пишет «Unsupported Cipher» или «Handshake Failed». Это часто бывает, когда сервер настроен на старые алгоритмы шифрования, а современный телефон их отбрасывает как небезопасные.
Решение: В конфиге сервера укажите список современных шифров (ECDHE-RSA-AES256-GCM-SHA384 и подобные).

4. Время на сервере и телефоне.
TLS критически зависит от точного времени. Если на телефоне 2023 год, а на сервере 2024 (или наоборот), сертификат будет считаться «недействительным», даже если он свежий.
Решение: Настройте NTP-сервер на телефоне и сервере.

5. Отсутствие Root CA.
Вы настроили Self-Signed, но не загрузили корневой сертификат на телефон.
Решение: Либо загрузите CA на телефон, либо (для теста) на время разрешите «Accept Invalid Certificates».

Сценарии: что делать в вашей ситуации

Давайте разберем конкретные ситуации, чтобы вы могли выбрать верный путь.

Ситуация А: «У меня домашний офис, один телефон и старый Asterisk».
Вам не нужно покупать сертификат. Сгенерируйте Self-Signed. Идите в меню телефона, найдите раздел «Certificates», загрузите туда server.crt. Поставьте галочку «Use TLS». Это быстро и бесплатно.

Ситуация Б: «У меня 50 телефонов в разных городах, они на разных провайдерах».
Ручная загрузка сертификатов на все 50 телефонов — это ад. Установите Let’s Encrypt на сервер. Настройте автообновление (Certbot). Телефоны автоматически доверяют Let’s Encrypt. Вам не придется лезть в настройки телефонов при каждом обновлении.

Ситуация В: «Телефоны Yealink, но они старые (прошивка 1.0)».
Старые телефоны Yealink часто не поддерживают современные алгоритмы шифрования (ECDHE). Вам придется настраивать сервер так, чтобы он предлагал более слабые шифры (RSA), и использовать TLS 1.0 или 1.1. Это компромисс безопасности.
Решение: Если возможно, обновите прошивку телефонов. Если нет — настройте сервер на поддержку устаревших протоколов, но знайте, что это слабое звено.

Практические рекомендации: как сделать «на века»

Чтобы ваша система работала стабильно, а не требовала перенастройки каждые полгода, следуйте этим правилам:

  • Используйте автоматическое обновление Let’s Encrypt. Напишите скрипт, который раз в 2 месяца обновляет сертификат и перезагружает сервис SIP. Это избавит от проблем с истечением срока действия.
  • Разделяйте порты. SIP (UDP 5060) и SIP-TLS (TCP 5061) должны быть на разных портах. Не пытайтесь объединить их в один порт, если не уверены в настройках фаервола и NAT.
  • Включите SRTP. Шифрование сигнализации без шифрования голоса — это полумера. В настройках SIP-транспорта обязательно укажите encryption=yes (или use_avp=1 для Asterisk), чтобы активирулся SRTP. Телефон и сервер должны договориться о шифровании звука.
  • Проверяйте сертификаты заранее. Используйте онлайн-инструменты (например, SSL Labs), чтобы проверить свой публичный сертификат перед тем, как разослать его клиентам.

Итог

Настройка SIP-TLS — это не магия, а строгая цепочка логических действий. Главное правило: сертификат должен соответствовать адресу подключения, а телефон должен доверять тому, кто его выдал.

Если вы настраиваете систему для себя или небольшого офиса, используйте Self-Signed сертификаты и загружайте их на телефоны вручную. Это даст вам полный контроль. Если вы разворачиваете крупную сеть или облачный сервис, используйте Let’s Encrypt — это сэкономит вам сотни часов настройки.

Не бойтесь ошибок. Если телефон пишет «Registration Failed», это не значит, что всё сломано. Это значит, что где-то в цепочке доверия есть разрыв. Проверьте время, проверьте CN, проверьте порт 5061. И, самое главное, используйте Wireshark. Когда вы увидите зашифрованный поток данных, вы поймете, что всё сделали правильно.

Информация в статье носит ознакомительный характер и основана на общепринятых практиках настройки VoIP-инфраструктуры. При настройке критически важных систем связи рекомендуется проводить тестирование в изолированной среде и привлекать сертифицированных инженеров для аудита безопасности.

Virtual-Sim.ru