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:
- REGISTER
- 401 Unauthorized
- REGISTER
- 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:
- Seu usuário SIP
- 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):
- realm
- nonce
- 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.