sexta-feira, 10 de janeiro de 2014

Criptografando o seu SIP Trunk com TLS

Fala pessoal!!!
Primeiramente, gostaria de desejar um feliz 2014!!

Faz bastante tempo que eu num faço um post no blog que não seja relatos de pessoas que passaram na prova. Confesso que é uma forma bastante prática de manter o blog atualizado! hahaha... só que num é só disso que pode viver o blog, né? Por outro lado, o blueprint atual está quase no fim, e não tenho o intuito de ficar me atualizando no blueprint novo para postar coisas relativas à próxima prova (a não ser que eu capitalize o blog e comece a ganhar dinheiro com isso! hahaha).

Portanto, hoje farei um post sobre um assunto que num tem nada a ver com a prova (pelo menos não a atual), mas que eu achei extremamente difícil achar referências boas na Internet quando precisei fazer. É sobre a configuração de um voice gateway SIP criptografado (TLS), usando certificados da estrutura do cliente. O que tem bastante na internet é sobre como fazer usando certificados self-signed do CUCM e Gateway, mas convenhamos que num deployment real, dificilmente isso vai acontecer. Geralmente o cliente tem toda uma estrutura de certificados da empresa para os seus serviços, e pede que a gente utilize essa estrutura.

Ok, serei sincero. Isso definitivamente não é a minha área de especialidade, então certamente tem coisa que pode estar errada. O que mostro abaixo é como eu fiz e deu certo.

Importando os certificados no Roteador

1. Crie um par de chaves (pública e privada) no Voice Gateway, dando um nome qualquer. Sugiro nomear com o próprio Hostname do roteador:

crypto key generate rsa general-keys label <HOSTNAME> mod 2048 exportable

2. Crie um Trustpoint no Voice Gateway, e nomeie ele com o Hostname:

crypto pki trustpoint <HOSTNAME>
 enrollment terminal
 fqdn HOSTNAME.domain.example.com ! - hostname e domínio
 subject-name CN=HOSTNAME.domain.example.com
 revocation-check none
 rsakeypair <HOSTNAME> ! - referencia às chaves criadas  no passo 1

3. Autentique o trustpoint, incluindo certificado Root

crypto pki authenticate <HOSTNAME>

Ao dar o comando, o roteador vai pedir para você colar o certificado root. Esse certificado você deve pedir ao cliente:

Enter the base 64 encoded CA certificate
<COLE A STRING CONTENDO O CERTIFICADO ROOT>

4. Gere o CSR (Certificate Sign Request) do roteador para ser assinado pelo cliente:

crypto pki enroll <HOSTNAME>
%Start certificate enrolment ..
Include serial? No
Include IP Address? No
Display CSR? Yes

O roteador vai gerar uma string, que você deve copiar toda ela num TXT e encaminhar para o cliente assinar no CA dele. Caso seja um Windows, o template deve conter as funções TLS Web Server Authentication, TLS Web Client Authentication e IPSec End System.


5. Quando o cliente enviar o certificado assinado pelo CA dele, importe de volta para o Roteador:

crypto pki import <HOSTNAME> certificate
Enter the base 64 encoded certificate
<COLE A STRING CONTENDO O CERTIFICADO ASSINADO>

Agora vamos fazer a parte dos certificados do CUCM.

Importando os certificados no CUCM

1. No CUCM, entre no OS Administrator. Vá em Security >> Certificate Management

2. Clique em Upload Certificate, e faça upload do Certificado Root para CallManager-trust e tomcat-trust.

3. Clique em Generate CSR e gere os CSRs do CallManager e tomcat.

4. Clique em Download CSR para baixar os arquivos

5. Envie para o cliente assinar no CA dele. Caso seja um Windows, o template deve conter as funções TLS Web Server Authentication, TLS Web Client Authentication e IPSec End System.

6. Quando o cliente mandar os certificados assinados, importe novamente como CallManager e tomcat (sem o trust).

7. Faça isso em todos os servidores do cluster, e depois reinicie tudo.

Configurando o SIP Trunk no CUCM

1. Crie um SIP Trunk Security Profile, marcando a opção Encrypted, com transport type TLS. No X.509 Subject Name, coloque o Hostname e Domain name do roteador, como no exemplo abaixo



2. Crie um SIP Trunk como o usual, mas marque a opção SRTP Allowed, aplique o Security Profile criado acima, e utilize a porta 5061 como Destination Port. Como Device Name do trunk, utilize o Hostname do roteador.

Configurando o SIP Trunk no Gateway

1. Crie a dial-peer voip normalmente, porém com os dois comandos destacados abaixo:
dial-peer voice X voip
 destination-pattern <XXXX>
 session protocol sipv2
 session target ipv4:x.x.x.x:5061
 session transport tcp tls
 srtp fallback
 (...)

2. Configure o SIP-TLS:

sip-ua
 crypto signalling remote-addr <CUCM-Pub> 255.255.255.255 trustpoint <HOSTNAME> strict-cipher
 crypto signalling remote-addr <CUCM-Sub> 255.255.255.255 trustpoint <HOSTNAME> strict-cipher

E pronto!

Troubleshooting

Esses debugs são muito úteis para fazer o troubleshooting do TLS
debug ssl openssl errors
debug ssl openssl msg
debug ssl openssl state
show sip-ua connection tcp tls detail

Um comentário: