Ahora sirve el asterisk
No es por desconfianza pero así "trabajan" quienes dicen revelar claves de hotmail.
Si le envío mis credenciales (código de activación) me asegura que puede generar la parte privada del certificado? Mi interés es subir el servicio sobre un Dlink sip .
Hace poco hubo un cambio en la autenticación y sólo está funcionando la versión más reciente del softphone azul (para residenciales). Las corporativas si se pueden montar sobre Asterisk porque son troncales, pero sobre internet de telmex, y creo que los clientes sip eventualmente podrían funcionar sobre 3g de comcel.
Claro entiendo la desconfianza de todos, pues mientras obtengo credibilidad, les cuento que he hecho un gran avance: Ya pude montar las credenciales en un asterisk!
Si me envías el código de activación te puedo regresar las credenciales SIP, no se si sobre un DLink SIP la cosa funcione por lo que voy a comentar más adelante.
La ventaja de mi método es que no es necesario que estés en la red de Telmex para que funcione, pues el SIP proxy es público.
La cosa fue bastante complicada, pues el servidor SIP de Telmex es EXTREMADAMENTE cuidadoso con los headers "To" y "From" el problema radica en que el asterisk envía el requerimiento register sin el campo username en los headers "To" y "From" es decir:
Normalmente asterisk envía:
<sip:0001814xxxx@190.144.159.138>
Pero el servidor de Telmex requiere:
"1814xxxx" <sip:0001814xxxx@190.144.159.138>
Entonces para solucionar esto fue necesario modificar el archivo chan_sip.c para la parte del registro, tal que enviara los campos como los requiere el servidor.
Luego de esto tuve más problemas, pues el "Invite" tambien requiere que sea identico al que se colocó en el paquete de registro, el problema esta vez fue que el asterisk coloca el hostname propio en el "From" header cosa que me parece normal, pero el servidor de Telmex responde siempre SIP/2.0 403 Forbidden, lo que toca hacer es modificar ese campo para que coloque el host remoto y no el local. Me tomó mas de una semana llegar a esta conclusión.
Así como están las cosas, montar las credenciales SIP de una línea residencial en un asterisk es un real camello. Pero con las modificaciones hechas al source code del asterisk funcionó al fin. Para los interesados es necesario aplicar un parche al archivo del source code del asterisk así (el parche solo está diseñado para asterisk 1.8.6):
--- chan_sip.c 2011-09-10 19:39:25.000000000 -0500
+++ chan_sip_new.c 2011-09-10 19:37:49.000000000 -0500
@@ -11595,10 +11595,18 @@
}
ourport = (p->fromdomainport) ? p->fromdomainport : ast_sockaddr_port(&p->ourip);
- if (!sip_standard_port(p->socket.type, ourport)) {
+ /*if (!sip_standard_port(p->socket.type, ourport)) {
snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s:%d>;tag=%s", n, l, d, ourport, p->tag);
} else {
snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=%s", n, l, d, p->tag);
+ }*/
+
+ if (p->portinuri!=5060 && p->portinuri!=0) {
+ //snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s:%d>;tag=%s", n, l, d, ourport, p->tag);
+ snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s:%d>;tag=%s", n, l, p->tohost,p->portinuri, p->tag);
+ } else {
+ //snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=%s", n, l, d, p->tag);
+ snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=%s", n, l, p->tohost, p->tag);
}
if (!ast_strlen_zero(explicit_uri)) {
@@ -12839,11 +12847,18 @@
ast_debug(1, "Scheduled a registration timeout for %s id #%d \n", r->hostname, r->timeout);
}
- snprintf(from, sizeof(from), "<sip:%s@%s>;tag=%s", r->username, S_OR(r->regdomain, sip_sanitized_host(p->tohost)), p->tag);
+ /*snprintf(from, sizeof(from), "<sip:%s@%s>;tag=%s", r->username, S_OR(r->regdomain, sip_sanitized_host(p->tohost)), p->tag);
if (!ast_strlen_zero(p->theirtag)) {
snprintf(to, sizeof(to), "<sip:%s@%s>;tag=%s", r->username, S_OR(r->regdomain, sip_sanitized_host(p->tohost)), p->theirtag);
} else {
snprintf(to, sizeof(to), "<sip:%s@%s>", r->username, S_OR(r->regdomain, sip_sanitized_host(p->tohost)));
+ }*/
+
+ snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=%s", r->authuser , r->username, S_OR(r->regdomain,p->tohost), p->tag);
+ if (!ast_strlen_zero(p->theirtag)) {
+ snprintf(to, sizeof(to), "\"%s\" <sip:%s@%s>;tag=%s", r->authuser, r->username, S_OR(r->regdomain,p->tohost), p->theirtag);
+ } else {
+ snprintf(to, sizeof(to), "\"%s\" <sip:%s@%s>", r->authuser, r->username, S_OR(r->regdomain,p->tohost));
}
/* Fromdomain is what we are registering to, regardless of actual
Para la línea de registro es algo como:
0001814xxxx@190.144.159.138:[sip password]:1814xxxx@190.144.159.138:5060/0001814xxxx~3600
El sip server domain es sip.cable.net.co