Let’s Encrypt no Openfire: Certificado Válido para Envio de Arquivos XMPP com Gajim

Objetivo

Permitir que clientes XMPP como o Gajim consigam:

  • Conectar com segurança ao seu servidor Openfire.
  • Enviar arquivos sem erro de “CA unknown” ou “certificate not trusted”.

Contexto

Por padrão, o Openfire usa um certificado autoassinado que não é reconhecido por clientes externos. Isso gera erros de validação TLS no momento do login ou do envio de arquivos via HTTP File Upload (porta 7443). A solução é substituir esse certificado por um emitido pela Let’s Encrypt.


Pré-requisitos

  • Servidor com Openfire instalado (caminho padrão dos keystores: /usr/share/openfire/resources/security/).
  • Domínio público apontando para o IP do servidor (por exemplo, xmpp.seudominio.com).
  • Porta 80 e 443 (para validação HTTP) e porta 7443 liberadas.
  • Acesso root ou sudo ao servidor.
  • Certbot instalado (sudo apt install certbot).

Passo 1 – Gerar o certificado Let’s Encrypt

Execute no servidor Openfire:

sudo certbot certonly --standalone -d xmpp.seudominio.com

Os arquivos resultantes estarão em:

  • /etc/letsencrypt/live/xmpp.seudominio.com/fullchain.pem
  • /etc/letsencrypt/live/xmpp.seudominio.com/privkey.pem

Passo 2 – Converter para PKCS12

O Openfire requer um keystore em formato PKCS12. Converta assim:

openssl pkcs12 -export \
  -in /etc/letsencrypt/live/xmpp.seudominio.com/fullchain.pem \
  -inkey /etc/letsencrypt/live/xmpp.seudominio.com/privkey.pem \
  -out /tmp/openfire.p12 \
  -name xmpp-cert \
  -passout pass:changeit
  • -name xmpp-cert define o alias no keystore.
  • -passout pass:changeit configura a senha que o Openfire espera por padrão.

Passo 3 – Importar no keystore do Openfire

  1. Backup do keystore atual:
    sudo cp /usr/share/openfire/resources/security/keystore /usr/share/openfire/resources/security/keystore.bak
  2. Importação:
sudo keytool -importkeystore \
  -destkeystore /usr/share/openfire/resources/security/keystore \
  -deststorepass changeit \
  -destkeypass changeit \
  -srckeystore /tmp/openfire.p12 \
  -srcstoretype PKCS12 \
  -srcstorepass changeit \
  -alias xmpp-cert \
  -noprompt

Isso sobrescreve o certificado autoassinado pelo Let’s Encrypt.


Passo 4 – Reiniciar o Openfire

sudo systemctl restart openfire

Verifique se o serviço Java está escutando nas portas 5222, 7443, 9090 etc.


Passo 5 – Verificar a instalação

Para garantir que o novo certificado está ativo na porta 7443 (HTTP File Upload):

openssl s_client -connect xmpp.seudominio.com:7443

Procurar em saída:

issuer= /C=US/O=Let's Encrypt/CN=R3
Verify return code: 0 (ok)

Se “Verify return code” for 0 e o “issuer” for Let’s Encrypt, está correto.


Passo 6 – Automação da renovação

Let’s Encrypt expira em 90 dias. Crie um cron job com deploy-hook:

sudo crontab -e

Adicione:

0 4 * * * certbot renew --quiet \
  --deploy-hook "openssl pkcs12 -export \
    -in /etc/letsencrypt/live/xmpp.seudominio.com/fullchain.pem \
    -inkey /etc/letsencrypt/live/xmpp.seudominio.com/privkey.pem \
    -out /tmp/openfire.p12 \
    -name xmpp-cert \
    -passout pass:changeit && \
  keytool -importkeystore \
    -destkeystore /usr/share/openfire/resources/security/keystore \
    -deststorepass changeit \
    -destkeypass changeit \
    -srckeystore /tmp/openfire.p12 \
    -srcstoretype PKCS12 \
    -srcstorepass changeit \
    -alias xmpp-cert \
    -noprompt && \
  systemctl restart openfire"

O Certbot tentará renovar diariamente, e o deploy-hook atualiza o keystore e reinicia o serviço.


Conclusão

Após seguir estes seis passos, seu Openfire estará configurado com um certificado Let’s Encrypt válido. O Gajim (e outros clientes XMPP) poderão enviar arquivos usando HTTP File Upload na porta 7443 sem erros de CA. A renovação automática mantém tudo atualizado sem intervenção manual.

Rolar para cima