Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

Регистрация в Asterisk по SIP-протоколу (самописный клиент)

0

Пытаюсь подсоединиться к Asterisk, но не получается, хотя вроде все по стандарту.

Посылаю запрос:

REGISTER sip:522@192.168.168.3:5060 SIP/2.0
Call-ID: 3b2c02ccb9482b630b85a7e0bade659e@192.168.168.143
CSeq: 1 REGISTER
From: <sip:522@192.168.168.3>
To: <sip:522@192.168.168.3>
Via: SIP/2.0/UDP 192.168.168.3:5060
Max-Forwards: 70
Contact: <sip:522@192.168.168.3>
Expires: 300
Content-Length: 0

Приходит ответ:

SIP/2.0 100 Trying
Via: SIP/2.0/UDP 192.168.168.3:5060;branch=z9hG4bK-323733-b04bef71f2d10b9b3d057d80bc3a7ad6;received=192.168.168.143
From: <sip:522@192.168.168.3>
To: <sip:522@192.168.168.3>
Call-ID: 3b2c02ccb9482b630b85a7e0bade659e@192.168.168.143
CSeq: 1 REGISTER
Server: Asterisk PBX 1.6.2.10
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO
Supported: replaces,timer
Content-Length: 0

SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.168.3:5060;branch=z9hG4bK-323733-b04bef71f2d10b9b3d057d80bc3a7ad6;received=192.168.168.143
From: <sip:522@192.168.168.3>
To: <sip:522@192.168.168.3>;tag=as133613ec
Call-ID: 3b2c02ccb9482b630b85a7e0bade659e@192.168.168.143
CSeq: 1 REGISTER
Server: Asterisk PBX 1.6.2.10
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO
Supported: replaces,timer
WWW-Authenticate: Digest algorithm=MD5,realm="asterisk",nonce="69c56be3"
Content-Length: 0

Как и описано в стандарте, беру header WWW-Authenticate и формирую новый запрос Register:

REGISTER sip:522@192.168.168.3:5060 SIP/2.0
CSeq: 2 REGISTER
From: <sip:522@192.168.168.3>
To: <sip:522@192.168.168.3>
Via: SIP/2.0/UDP 192.168.168.3:5060
Max-Forwards: 70
Contact: <sip:522@192.168.168.3>
Expires: 300
Call-ID: 3b2c02ccb9482b630b85a7e0bade659e@192.168.168.143
WWW-Authenticate: Digest algorithm=MD5,realm="asterisk",nonce="69c56be3",username="522",response="7b2ebbf8869afc435f52d5b132563d7e",uri="sip:192.168.168.3:5060"
Content-Length: 0

Хэш код в response правильный, проверял руками. В ответ все равно получаю 401 (Unauthorized), а не 200 (OK).

Может, я что-то напутал с заголовками? В какую сторону копать?

удалить закрыть спам изменить тег редактировать

спросил 2012-04-10 16:59:31 +0400

vallhund Gravatar vallhund
1 1 2

Comments

А как хеш считаешь?

switch ( 2012-04-10 21:26:04 +0400 )редактировать

Видимо, неправильно, т.к. приходит уже 403, а asterisk в логах ругается на пароль. Считаю так: username = "522"; realm = "asterisk"; password = "123456qw"; method = "REGISTER"; digest-uri = "192.168.168.3"; nonce = беру из WWW-Authentication;

A1 = MD5 (username + ":" + realm + ":" + password); A2 = MD5 (method + ":" + digest-uri); result = MD5 (A1 + ":" + nonce + ":" + A2);

Понятно, что где-то я ошибаюсь, но непонятно где. Скорее всего, в digest-uri, но стандарт слишком противоречиво описывает, что и в каком виде туда писать. (Сначала пишут, что нужен request-URI из заголовка REGISTER, а потом пишут, что digest-uri не должен содержать username и @) Сам калькулятор MD5 у меня работает правильно, я проверял.

vallhund ( 2012-04-11 14:17:06 +0400 )редактировать

3 Ответа

1

копать в сторону соответствия rfc или берите трассируйте сообщения от работающего софтфона и ищите разногласия с вашим.

ссылка удалить спам редактировать

ответил 2012-04-10 17:23:45 +0400

svoy Gravatar svoy
1603 1 4 20
http://svoy.in.ua/
1
  1. Хидер с хэшем который вы формируете в ответ на 401 должен обзываться Authorization.
  2. Trying на REGISTER не шлется (в нормальных железках). У вас там не TCP часом ?
ссылка удалить спам редактировать

ответил 2012-04-10 19:10:23 +0400

znk Gravatar znk
45 1 4

Comments

  1. Спасибо, поменял. Теперь приходит 403 (неправильный пароль), это уже что-то :)
  2. Нет, UDP
vallhund ( 2012-04-11 13:57:04 +0400 )редактировать
1

Думаю самое простое это посмотреть в коде астериска, как они это делают и что просят для digest аутентификации.

ссылка удалить спам редактировать

ответил 2012-04-11 14:29:36 +0400

switch Gravatar switch
8334 11 7 91
http://lynks.ru/

обновил 2012-04-11 14:30:06 +0400

Comments

Теперь понять бы как это посмотреть... :)

vallhund ( 2012-04-11 15:09:24 +0400 )редактировать

Качаешь с asterisk.org (http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-1.8.11.0.tar.gz) исходники, лезешь в файл chan_sip.c. примерно на 4425 строке есть такое:

/* compute the expected response to compare with what we received */
{
    char a2[256];
    char a2_hash[256];
    char resp[256];

    snprintf(a2, sizeof(a2), "%s:%s", sip_methods[sipmethod].text,
            S_OR(keys[K_URI].s, uri));
    ast_md5_hash(a2_hash, a2);
    snprintf(resp, sizeof(resp), "%s:%s:%s", a1_hash, usednonce, a2_hash);
    ast_md5_hash(resp_hash, resp);
}

в свою очередь функция astmd5hash выглядит примерно так

    void ast_md5_hash(char *output, char *input)
    {
    struct MD5Context md5;
    unsigned char digest[16];
    char *ptr;
    int x;
    MD5Init(&amp;md5);
    MD5Update(&amp;md5, input, strlen(input));
    MD5Final(digest, &amp;md5);
    ptr = output;
    for (x=0;x&lt;16;x++)
        ptr += sprintf(ptr, "%2.2x", digest[x]);
    }
switch ( 2012-04-11 15:59:54 +0400 )редактировать

Ваш ответ

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку

подписаться на rss ленту новостей

Статистика

Задан: 2012-04-10 16:59:31 +0400

Просмотрен: 1,193 раз

Обновлен: Apr 11 '12

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.