- Conhecimento
- Ronaldo Sacco
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:
- 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:
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.