- Спасибо, поменял. Теперь приходит 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,861 раз
Обновлен: Apr 11 '12
Open source SIP телефон [закрыт]
А вы знаете что permit/deny глобально не работают?
Asterisk провайдер PCTEL проблема входящего звонка
как понять что происходит на астериске
звонки на московские мобильные поступали на киевстар номера
SIP Proxy для нескольких организаций
Проект компании "АТС Дизайн"
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 )редактировать