- Спасибо, поменял. Теперь приходит 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,601 раз
Обновлен: Apr 11 '12
Проект компании "АТС Дизайн"
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 )редактировать