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
- Backup do keystore atual:
sudo cp /usr/share/openfire/resources/security/keystore /usr/share/openfire/resources/security/keystore.bak
- 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.