SIP REGISTER

SIP REGISTER

Aqui você aprenderá como funciona o pacote SIP REGISTER, comumente utilizado para registrar um ramal em um PABX IP.
Você também entenderá qual é a lógica de termos um pacote REGISTER seguido de um 401 Unauthorized em cada autenticação e como isso é importante para a sua segurança.

Tentarei ser o mais objetivo e didático possível!

Vamos lá!

O registro SIP é uma das formas onde o SERVIDOR passa a conhecer o IP do CLIENTE.

Sugiro que leia novamente a frase acima.

É isso mesmo!
A principal utilização do registro (REGISTER) é fazer com que o servidor saiba qual é o IP do ramal que está ativo. Desta forma, o servidor conseguirá mandar uma chamada para ele, pois saberá qual é o seu IP naquele exato momento.

E se o IP mudar?
Um novo pacote REGISTER é enviado de tempos em tempos do cliente para o servidor, visando sempre manter o servidor atualizado sobre qual é o IP do ramal.
Portanto, não tem problemas se o IP do ramal mudar. Ele pode ser dinâmico e funcionará perfeitamente bem! mesmo atrás de NAT (assunto pra outro dia)!

Quando temos IP fixo no lado do servidor e no lado do cliente a configuração pode ser feita por apontamento IP - IP, e o registro passa a se tornar desnecessário! Geralmente essa configuração é utilizada em troncos SIP entre o seu servidor e a sua operadora de telefonia.

Muitas pessoas acreditam que o REGISTRO serve exclusivamente para permitir que aquele ramal faça ligações pelo PABX. Este conceito está errado. Um ramal não registrado não receberá ligações, pois o PABX não saberá qual é o seu IP, mas poderá realizar ligações normalmente.

Capturando um pacote REGISTER

Primeiramente, considere o meu cenário:
Estou com um telefone IP Yealink, com IP 10.255.2.5.
Configurei o ramal 200 nele, registrando no IP 10.255.2.22, com a senha MySecret
Iniciei uma captura de pacotes no servidor.

Veja o que capturei:

Note que temos 4 pacotes, nesta ordem:

  1. REGISTER
  2. 401 Unauthorized
  3. REGISTER
  4. 200 OK

É normal (e esperado) que muita gente se pergunte o motivo desse "401 Unauthorized" e após um "200 OK". Este procedimento faz parte do que chamamos de CHALLENGE. E serve para que a sua senha não trafegue em texto puro.

Calma! Vou explicar em detalhes!

Veja na primeira imagem acima está mostrando o primeiro pacote REGISTER.
Note que dentro deste pacote não possui a sua senha em nenhum campo.
Como que o servidor irá retornar um "200 OK", indicando que você está autenticado, se você não enviou a sua senha? Pois é.. então é esperado o retorno "401 Unauthorized".

O segredo está nos detalhes! Esta resposta do pacote 401 Unauthorized contém algumas informações importantes, destacadas abaixo:

Atenção especial na linha "www-authenticate" que o servidor enviou para o meu ramal.

Basicamente ele está dizendo: "Você não está autorizado. Caso queira se autenticar aqui, me envie a sua senha criptografada com o algoritmo MD5. Adicione neste hash MD5 os valores de nonce e realm".

Vamos ao próximo pacote de REGISTER! Agora contendo a autenticação:

Note que agora, diferentemente do primeiro REGISTER, temos a linha "Authorization". Agora sim estamos a um passo de registrar, de fato, o ramal.
Veja o campo "response", marcado na seta em vermelho. Este é o hash md5 da minha senha MySecret.

E a resposta do servidor: "200 OK" - Autorizado!!

E é desta forma, que a autenticação ocorre! Chave pra um lado, md5 pra outro, e voilà: 200 OK.

Portanto, aprendemos que o CHALLENGE (Register -> 401 -> REGISTER -> 200) é um procedimento correto e esperado, para garantir a sua segurança na autenticação do seu ramal.

Extras - Como é o código por trás do hash MD5 do REGISTER?

Agora, se você é curioso como eu, e deseja saber como é feito o hash em md5 do pacote REGISTER, essa leitura é pra você.

Criei um código PHP simples que irá gerar esse hash da senha. Assim facilitará o seu entendimento e você poderá ainda brincar com o código. O resultado dele é este:

O campo "response", que o seu ramal envia para o servidor, nada mais é que "um mix" de 03 hashes MD5. E sim, tanto o seu ramal quanto o seu servidor ficam a todo o momento realizando hashes e mais hashes md5.

Abaixo, o coração do código:

Simples, não?
O resultado do $hash_3 é o seu response!

Ok, ok, se você chegou até aqui, então vamos aos detalhes...

Primeiramente, você precisará ter as 2 informações abaixo:

  1. Seu usuário SIP
  2. Sua senha SIP

Além das informações acima, você vai precisar coletar no pacote SIP as 3 informações abaixo (são fornecidas pelo 401 Unauthorized):

  1. realm
  2. nonce
  3. uri

É simples, veja onde elas estão:

Obs: Note que as informações 1 e 3 são fornecidas pelo 401 Unauthorized. Estas são utilizadas para montagem do hash md5 que será posteriormente enviado do cliente para o servidor.

Agora com estas 5 informações coletadas, basta inserir dentro do código e executá-lo. Altere as 5 primeiras variáveis.

Segue o código em texto puro:

<?php

//Created By: Ronaldo Sacco - ronaldo@saperx.com.br
//Date: 18/02/2022

//****************************
//*Substitua os campos abaixo*
//****************************

//Usuario e senha SIP
$sip_secret   = "MySecret";
$sip_username = "200";

//Colete do pacote SIP:
$sip_realm = "saperx";
$sip_uri   = "sip:10.255.2.22:5060";
$sip_nonce = "197ab57f";

//****************************
//*Nao precisa alterar nada daqui pra baixo
//****************************

//Step 01
$hash_1 = md5("$sip_username:$sip_realm:$sip_secret");

//Step 02
$hash_2 = md5("REGISTER:".$sip_uri);

//Step 03
$hash_3 = md5("$hash_1:$sip_nonce:$hash_2");

echo $hash_3."\n";

?>

Alterado as variáveis, basta rodar para obter o resultado abaixo:

 

E aí, matou a curiosidade? Este post foi útil para você? Espero, realmente, que tenha gostado! Afinal, essa é uma dúvida de muitos clientes.

 

Autor: Ronaldo Sacco

Conheça os softwares que vão
descomplicar a telefonia para provedores

online
Ao utilizar o chat, você aceita a nossa Política de Privacidade.
Avatar