- Спасибо, поменял. Теперь приходит 403 (неправильный пароль), это уже что-то :)
- Нет, UDP
Пытаюсь подсоединиться к 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).
Может, я что-то напутал с заголовками? В какую сторону копать?
копать в сторону соответствия rfc или берите трассируйте сообщения от работающего софтфона и ищите разногласия с вашим.
Думаю самое простое это посмотреть в коде астериска, как они это делают и что просят для digest аутентификации.
Качаешь с 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(&md5); MD5Update(&md5, input, strlen(input)); MD5Final(digest, &md5); ptr = output; for (x=0;x<16;x++) ptr += sprintf(ptr, "%2.2x", digest[x]); } switch ( 2012-04-11 15:59:54 +0400 )редактировать
Задан: 2012-04-10 16:59:31 +0400
Просмотрен: 2,714 раз
Обновлен: Apr 11 '12
Не работают исходящие без Route CID
GSM шлюз с поддержкой факсов + TrixBox 2.8
Asterisk не принимает часть SIP пакетов FIXED
username и auth username - что-то изменилось?
не регистрируется sip транк с 3 way authentication
Не удается связать * 1.8 и * 11 (Закрыт)
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.
А как хеш считаешь?
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 )редактировать