First time here? Check out the FAQ!

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

Регистрация в 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).

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

спросил Apr 10 '12

vallhund Gravatar vallhund
1 1 1 2

Comments

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

switch (Apr 10 '12)edit

Видимо, неправильно, т.к. приходит уже 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 (Apr 11 '12)edit

3 Ответа

1

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

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

ответил Apr 10 '12

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

ответил Apr 10 '12

znk Gravatar znk
45 1 4

Comments

  1. Спасибо, поменял. Теперь приходит 403 (неправильный пароль), это уже что-то :)
  2. Нет, UDP
vallhund (Apr 11 '12)edit
1

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

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

ответил Apr 11 '12

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

обновил Apr 11 '12

Comments

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

vallhund (Apr 11 '12)edit

Качаешь с 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 (Apr 11 '12)edit

Ваш ответ

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 ленту новостей

Статистика

Задан: Apr 10 '12

Просмотрен: 2,616 раз

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

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