Траблшутинг SIP Digest-аутентификации: расчет хэша Response (MD5, Nonce)
- Циклические ошибки
401 Unauthorizedили407 Proxy Authentication Requiredпри правильном пароле. - IP-телефон отправляет повторный REGISTER, но сервер сбрасывает сессию по тайм-ауту.
- В логах сервера фиксируется ошибка
Authentication failed: wrong response / invalid realm. - Ошибки
Stale Nonceпри высокой задержке между сервером и клиентом.
1. Анализ процесса 3-Way SIP Handshake
- Клиент шлет
REGISTERбез авторизации. - Сервер отвечает
401 Unauthorized(или407) с заголовкомWWW-Authenticate, содержащимrealm,nonceи алгоритм. - Клиент формирует заголовок
Authorizationс вычисленным полемresponse.
2. Алгоритм ручного расчета Response (MD5)
Формула согласно RFC 2617:
HA1 = MD5(username:realm:password)
HA2 = MD5(method:digestURI)
Response = MD5(HA1:nonce:HA2)Если используется параметр qop=auth:
HA2 = MD5(method:digestURI)
Response = MD5(HA1:nonce:nc:cnonce:qop:HA2)3. Проверка параметров в дампе Wireshark
- username — должен точно соответствовать Auth User (логину авторизации), а не внутреннему extension.
- realm — имя домена/IP сервера. Несоответствие realm приводит к неверному HA1.
- nonce — уникальная строка сервера. Если пришел флаг
stale=true, клиент обязан пересчитать хэш с новым nonce.
4. Диагностика в консоли Asterisk / FreeSWITCH
Включите расширенную трассировку SIP:
# Asterisk CLI
pjsip set logger on
# FreeSWITCH CLI
sofia profile internal siptrace on Частые вопросы (FAQ)
В чем разница между ответами 401 Unauthorized и 407 Proxy Authentication Required?
Код 401 выдается оконечным сервером/регистратором (UAS) через заголовок WWW-Authenticate, а 407 — промежуточным прокси-сервером или SBC через заголовок Proxy-Authenticate.
Почему при правильном пароле аутентификация завершается ошибкой?
Частые причины: несовпадение Realm (клиент считает realm 'asterisk', а сервер ждет IP-адрес), спецсимволы в пароле, некорректно экранированные клиентом, или рассинхронизация Auth Username и SIP Extension.
Что означает параметр 'nc' (Nonce Count)?
Это 8-значный шестнадцатеричный счетчик (например, 00000001), который увеличивается клиентом при каждом последующем запросе с тем же nonce для защиты от атак повторного воспроизведения (Replay Attack).
Передается ли пароль в открытом виде при Digest-аутентификации?
Нет. Передается только односторонний MD5/SHA-256 хэш, рассчитанный с добавлением одноразовой случайной последовательности (nonce).