BOMBOLOM.COM

(correio) IMAP sobre SSL ou TLS usando o Cyrus

Se quisermos aceder a serviços remotos, passando por redes inseguras somos sempre obrigados a usar protocolos cifrados. Para o efeito podemos usar SSL ou o seu sucessor TLS (mais informação aqui).

Essencialmente, usando os métodos referidos, conseguimos estabelecer uma ligação cifrada entre o cliente de mail e o servidor IMAP. Para o efeito temos de criar um certificado digital e a seguir configurar o servidor de IMAP para usar este certificado. Nessa altura o Cyrus responderá usando qualquer um destes métodos.

Fazer tudo isto utilizando o Cyrus é trivial, como se pode ver a seguir.

Criar o certificado auto-assinado

Em primeiro lugar temos de criar um certificado digital. Notar que se quisermos um certificado assinado por uma CA, então deveremos seguir as instruções da CA para geração do pedido de certificado. Como este processo varia de CA para CA, só vou mostrar neste artigo como criar um certificado auto-assinado.

Criar uma directoria para guardar o certificado:

# mkdir /arquivo/mail/ssl/ ; cd /arquivo/mail/ssl/

Esta directoria só faz sentido se temos o Cyrus configurado de acordo com o que se descreveu aqui. Eu costumo criar um file system onde é guardada toda a informação do servidor - arquivo de mails, shares do samba, bases de dados, etc, (em vez de usar os locais tradicionais). É claro que esta directoria poderá ser qualquer uma desde que não corra o perigo de ser apagada facilmente.

Para criar o pedido de assinatura do certificado fazer:

# openssl req -new -nodes -newkey rsa:2048 -out req_cyrus.pem -keyout key_cyrus.pem
Generating a 2048 bit RSA private key
........................................................+++
....................................................................+++
writing new private key to 'key_cyrus.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:PT
State or Province Name (full name) [Some-State]:Portugal
Locality Name (eg, city) []:Lisboa
Organization Name (eg, company) [Internet Widgits Pty Ltd]:bombolom.com
Organizational Unit Name (eg, section) []:TI
Common Name (eg, YOUR name) []:bombolom.com
Email Address []:helder@bombolom.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

(Output a azul)

Este comando cria a chave privada (key_cyrus.pem) e o pedido de certificado (req_cyrus.pem). A chave vai ser do tipo RSA com um tamanho de 2048 bits.

O pedido de certificado contém a nossa chave publica (criado a partir da chave privada que criamos com o mesmo comando) e a nossa informação que é pedida quando corremos o comando. Este pedido de certificado é assinado digitalmente com a nossa chave privada.

A seguir resta auto assinar o pedido de certificado:

# openssl x509 -in req_cyrus.pem -out self_signed.crt -req -signkey key_cyrus.pem -days 3650
Signature ok
subject=/C=PT/ST=Portugal/L=Lisboa/O=bombolom.com/OU=TI/CN=bombolom.com/emailAddress=helder@bombolom.com
Getting Private key

Deste comando obtemos o nosso certificado (self_signed.crt). Se nós fossemos uma CA utilizaríamos a chave privada da CA para assinar o certificado, assim, como não somos, usamos a chave privada gerada no passo anterior. Daqui resulta um ficheiro que vai ligar a informação entrada (subject=/C=PT/ST=Portugal/L=Lisboa/O=bombolom.com/OU=TI/CN=bombolom.com/emailAddress=helder@bombolom.com), ou seja a nossa identidade, à chave privada gerada inicialmente.

O Cyrus aceita concatenados a chave privada e o certificado:

# cp key_cyrus.pem cyrus_server.pem
# cat self_signed.crt >> cyrus_server.pem

Na configuração do Cyrus vamos utilizar este par chave privada/certificado.

Por razões que ultrapassam o âmbito deste artigo, tenho de deixar de uma forma muito clara e inequívoca expressa a necessidade de proteger a todo o custo a chave privada. Idealmente esta chave privada estaria sempre cifrada e só seria decifrada pelo servidor, isto implicaria não utilizar a opção '-nodes' no primeiro comando re-inserir a palavra passe da chave privada de cada vez que fosse necessário reiniciar o Cyrus. Para proteger a chave privada deveremos fazer:

# chown cyrus:mail *
# chmod go-rw *

Configurar o servidor IMAP

A configuração é extremamente simples, basta acrescentar ao ficheiro '/etc/imapd.conf', as linhas:

tls_cert_file: /arquivo/mail/ssl/cyrus_server.pem
tls_key_file: /arquivo/mail/ssl/cyrus_server.pem
tls_ca_file: /arquivo/mail/ssl/cyrus_server.pem

E habilitar o uso de imaps em '/etc/cyrus.conf', que consiste em tirar a marca de comentário '#' da linha:

imaps           cmd="imapd -s -U 30" listen="imaps" prefork=0 maxchild=100

(Na secção 'SERVICES'.)

Basta agora reiniciar o Cyrus:

# /etc/init.d/cyrus2.2 restart

(Ajuste o comando anterior para a sua versão do Cyrus).

Neste momento temos o servidor a funcionar, quer em modo TLS, quer em modo SSL. No modo TLS a ligação é iniciada normalmente para a porta imap(143). A seguir verificam-se as capacidades do servidor e se este tiver a capacidade 'STARTTLS' é feita a ligação cifrada. Por outro lado se fizermos uma ligação SSL, esta é dirigida à porta imaps (993) e é inteiramente cifrada, desde o principio.

Obter a checksum do nosso certificado

O cliente que liga ao servidor com um certificado auto assinado não tem forma de ter a certeza de estar a ligar para o servidor certo ou se por outro lado está a ser vítima de um 'man in the middle attack'. Assim antes de aceitarmos a ligação a um servidor deste tipo deve-se verificar o checksum do certificado que o cliente obteve com a checksum do certificado que gerámos à pouco.

Para obter a checksum fazer:

# openssl x509 -sha1 -noout -fingerprint -in cyrus_server.pem
SHA1 Fingerprint=05:4C:01:BF:6C:BF:42:06:9F:B1:8C:94:94:4A:5E:1C:69:2F:EA:DD

Neste caso o nosso fingerprint é: '05:4C:01:BF:6C:BF:42:06:9F:B1:8C:94:94:4A:5E:1C:69:2F:EA:DD'. A primeira vez que ligamos ao servidor (ou se for paranóico, sempre que ligar ao servidor - há sempre a possibilidade de terem modificado o seu cliente de mail!) deve de verificar se a checksum que lhe é apresentada é igual à que gerou.

Testar a Ligação

A ligação SSL deve ser sempre testada, quer utilizando um sniffer, quer estabelecendo uma ligação directamente ao servidor IMAP. Como a ligação é cifrada não podemos usar o 'netcat' ou 'telnet' para fazer esse teste. Em vez disso temos de usar o utiliário 'openssl' (o mesmo que usamos para extrair as fingerprints do certificado):

$ openssl s_client -crlf -connect imap.gmail.com:993
CONNECTED(00000003)
depth=1 /C=US/O=Google Inc/CN=Google Internet Authority
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=imap.gmail.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
[... snip ...]
---
* OK Gimap ready for requests from 213.22.156.108 10if7440274eyd.24
AA01 LOGIN example@gmail.com XXXXXXXXXXXXXX
AA01 OK example@gmail.com authenticated (Success)
AA02 LOGOUT
* BYE LOGOUT Requested
AA02 OK 73 good day (Success)
read:errno=0
(Cortei algum do output do servidor.)

Configuração dos clientes

Resta agora configurar os clientes de mail. Por exemplo para o Thunderbird deveremos, na configuração do servidor de cada conta que queremos mudar, escolher o tipo de configuração segura:

Quando tentarmos ver o mail nesta conta ser-nos-á apresentado o seguinte diálogo:

Aqui deveremos escolher se queremos aceitar o certificado permanentemente, para a sessão corrente apenas, ou se o rejeitamos, em cujo o caso não conseguiremos aceder ao mail.

Atenção! Antes de aceitar o certificado, deveremos examinar o respectivo checksum (como se explica no ponto anterior). Deveremos pois, clicar em "Examinar Certificado..." e verificar se as checksums coincidem:

11.03.2009 | Ler mais | Comentários | Tags , ,

Voltar à Página principal | Made with PyBlosxom