Zimbra Letsencrypt Multidomínios Howto

Faz tempo que mantenho um ambiente de hospedagem de e-mails para pequenos clientes. Eles são muito especiais porque se preocupam de verdade com a privacidade, sem abrir mão de ter todos os recursos e comodidades dos grades provedores.

Na KyaHosting.com garantimos isso.

Mas em tempos de muito cuidado e proteção, ter conexões encriptadas reconhecidas pelos navegadores é muito importante. A iniciativa da EFF, Let’s Encrypt permite ter certificados atenticados e reconhecidos por quase todos os navegadores, gratuitamente.

Este tutorial se aplica às instalações que tem Proxy instalado e somente a elas. Isso porque o modo que vamos usar altera, exatamente, o Nginx que é usado pelo Zimbra como Proxy Reverso.

Meus requisitos são:

Pré requisitos

zmprov md seudominio zimbraVirtualHostname webmail.seudominio 

3. O certbot tem que estar instalado na versão 1.19 ou superior

Se o seu certbot não estiver atualizado siga os passos abaixo:

Ubuntu

apt purge certbot
snap install core
snap refresh core
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
certbot --version

Centos

yum install snapd
service snapd start
snap install core
ln -s /var/lib/snapd/snap /snap
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
certbot --version

Limitações

O Zimbra permite o uso de certificados específicos por domínio graças ao uso do proxy, assim cada domínio carrega seu próprio certificado quando se acessa a URL definida na opção zimbraVirtualHostname.

Mas o proxy atende apenas o servidor web, ou seja, os protocolos HTTP e HTTPS. Então ao acessar um certo domínio pelo navegador o certificado será “servido” corretamente e o cadeado vai aparecer certinho.

O proxy não atende os protocolos IMAP, POP e SMTP, portanto o certificado personalizado não vai funcionar quando se configurar o cliente de e-mail para usar o mesmo hostname definido na opção zimbraVirtualHostname. A conexão desses protocolos será feita sempre diretamente na porta sem proxy e o certificado usado será o certificado raiz do Zimbra.

Com esse entendimento há duas formas de se lidar com a situação:

1 – Adicionar todos os domínios no certificado raiz. Inclusive isso anularia este tutorial completamente pois não seria necessário ter um certificado por domínio, pois todos estarão no certificado raiz. Se sua instalação tem poucos domínios e eles não mudam muito, pode ser a melhor alternativa, mas se o volume de domínios é grande a rotatividade também, ter que gerenciar o domínio rais o tempo todo com dezenas de domínios pode não ser realista.

2 – Apontar todos os clientes de e-mail externos que usam IMAP/POP e SMTP para o nome do servidor raiz. Então o acesso via web é personalizado, mas a configuração do cliente é sempre o mesmo para todos com o nome do servidor principal.

Metodologia

Nós vamos usar o método chamado “challenge ACME”. Nesse método o “certbot” escreve uma sequência única em um diretório específico que está acessível pela web. Para isso temos que criar o diretório e configurar o Nginx para responder corretamente a URL esperada pelos servidores da Let’s Encrypt.

Então mãos à obra!

Criando o diretório

Abaixo só comandos que usei. É claro que você poderá usar outro diretório, mas cuidado para acertar isso em todas as etapas.

mkdir /opt/zimbra/data/nginx/letsencrypt
chown zimbra: /opt/zimbra/data/nginx/letsencrypt 

Alterando o template do Nginx

O que esta alteração vai fazer é criar entradas válidas no Nginx para todos os domínios configurados em seu Zimbra.

1 – Edite os arquivos

/opt/zimbra/conf/nginx/templates/nginx.conf.web.http.template
/opt/zimbra/conf/nginx/templates/nginx.conf.web.https.template

2 – Adicione a linha abaixo antes da última } , assim:

<div class="\&quot;wp-block-group\&quot;">&nbsp;</div>

Reiniciando o proxy para fazer as configurações:

su zimbra -c\"/opt/zimbra/bin/zmproxyctl restart\"

As vezes o Zimbra não gosta muito de reiniciar apenas o proxy, então considere reiniciar o Zimbra completo.

Testando

O Let\’s Encrypt tem limitações de acesso, então o que fazemos é indicar um e-mail diferente por domínio para ser registrado.

Para saber se as configurações estão corretas, é hora de fazer um teste “–dry-run” com o certbot, assim:

certbot certonly -d webmail.dominio1.com --email [email protected] --preferred-chain "ISRG Root X1" --key-type rsa --agree-tos --webroot --webroot-path /opt/zimbra/data/nginx/letsencrypt/ --dry-run

Você pode esperar uma saída como esta:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
 Plugins selected: Authenticator webroot, Installer None
 Obtaining a new certificate
 Performing the following challenges:
 http-01 challenge for webmail.dominio1.com
 Using the webroot path /opt/zimbra/data/nginx/letsencrypt for all unmatched domains.
 Waiting for verification...
 Cleaning up challenges
IMPORTANT NOTES:
 - The dry run was successful.
 - Your account credentials have been saved in your Certbot
 configuration directory at /etc/letsencrypt. You should make a
 secure backup of this folder now. This configuration directory will
 also contain certificates and private keys obtained by Certbot so
 making regular backups of this folder is ideal.

Sucesso!!!!

Gerando o certificado real

Basta executar o mesmo comando acima sem o “–dry-run”

certbot certonly -d webmail.dominio1.com --preferred-chain "ISRG Root X1" --email [email protected] --key-type rsa --agree-tos --webroot --webroot-path /opt/zimbra/data/nginx/letsencrypt/

O certificado estará salvo em

/etc/letsencrypt/live/webmail.seudominio1.com

Assinando o certificado para poder usá-lo

O certificado gerado pelo Let’s Encrypt precisa ser assinado pela autoridade certificadora (CA) da sua instalação do Zimbra, ou vai dar erro. Em seguida o certificado e a chave precisam ser unidas.

Na sequência abaixo vamos juntar as partes e testar

a) Visando facilitar as linhas de comando, vamos começar entrando no diretório onde o Let’s Encrypt salvou seu certificado. Em nosso caso:

cd /etc/letsencrypt/live/webmail.seudominio1.com

b) Adicione o conteúdo abaixo ao arquivo chamado “chain.pem”, sem deixar linhas em branco.

-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----

c) Junte os arquivos para assinar o certificado, assim:

>cert.bundle ; cat cert.pem chain.pem >> cert.bundle

d) Remova o certificado e a chave anterior se ele existir, assim:

rm -f /opt/zimbra/conf/domaincerts/dominio1.crt
rm -f /opt/zimbra/conf/domaincerts/dominio1.key

e) Copie tudo para um dir em /tmp assim:

mkdir /tmp/letscert
cp privkey.pem cert.pem chain.pem /tmp/letscert
chown zimbra: /tmp/letscert -R

f) Teste para saber se o certificado está correto, executando o comando abaixo:

su - zimbra -c"cd /tmp/letscert ; /opt/zimbra/bin/zmcertmgr verifycrt comm privkey.pem cert.pem chain.pem"

g) Se o teste acima der um resultado “Valid certificate chain: cert.pem: OK”, salve o novo certificado, assim:

su zimbra -c"/opt/zimbra/libexec/zmdomaincertmgr savecrt dominio1.com cert.bundle privkey.pem"

h) Finalmente Instale o certificado:

su zimbra -c"/opt/zimbra/libexec/zmdomaincertmgr deploycrts"

Reiniciando o Zimbra

A parte mais legal deste novo método é que não é preciso parar e reiniciar o Zimbra. Basta fazer um “reload”, que é instantâneo!

su zimbra -c"/opt/zimbra/bin/zmproxyctl reload"

Script!

Script para automatizar isso. Ele recebe o domínio como argumento e eu chamei ele de zm_ssl.sh

Você baixá-lo daqui -> Clique Aqui

Atualizando os certificados

Agora que seu Zimbra não precisa ser parado para criar ou renovar certificados, pode-se rodar o comando “renew” sem maiores problemas.

É claro que quando o certificado for renovado, será necessário repetir os procedimentos acima.

Para renovar os certificados execute:

certbot renew

E depois refaça a parte do script que assina, verifica, salva e instala o novo certificado.

Script para isso? em breve…. aqui mesmo…