Assinatura DKIM

DKIM (DomainKeys Identified Mail) é um mecanismo de autenticação que permite ao servidor de destino verificar que o e-mail foi enviado por um servidor autorizado pelo domínio do remetente.

Como o mxout assina

O mxout usa RSA-SHA256 com canonicalização relaxed/relaxed. RSA-2048 é o padrão escolhido por compatibilidade universal: praticamente todos os MTAs receptores suportam esse algoritmo e tamanho de chave.

A canonicalização relaxed/relaxed normaliza espaços e capitalização de cabeçalhos e do corpo antes de calcular o hash. Isso torna a assinatura robusta a alterações superficiais feitas por servidores intermediários (como adicionar espaços em headers).

Headers assinados

O mxout assina os seguintes headers:

From
To
Subject
Date
Message-ID

Esses campos identificam o e-mail de forma única e cobrem os dados que o receptor humano vê. Assinar apenas esses headers (em vez de todos) reduz a chance de quebra por headers adicionados em trânsito.

Por que o mxout gera Date e Message-ID antes de assinar

O mxout gera o Message-ID (formato <unixts.token@dominio-do-from>) e o Date como parte do processo de montagem, antes de calcular a assinatura DKIM. Se esses campos fossem gerados depois ou pelo cliente, haveria dois problemas:

  1. A assinatura cobriria campos ausentes ou incorretos.
  2. Servidores intermediários poderiam injetar seus próprios valores, invalidando a assinatura.

Ao controlar esses campos internamente, o mxout garante que a assinatura cubra exatamente o que será entregue.

Kit DKIM

Cada domínio configurado no mxout tem um kit com dois campos:

{
  "selector": "s1",
  "key_path": "/etc/mxout/keys/exemplo.com.pem"
}
  • selector: nome da subdivisão DNS onde a chave pública está publicada.
  • key_path: caminho para a chave privada RSA-2048 em formato PKCS#8 PEM no servidor.

A chave privada nunca sai do servidor. Ela é lida em tempo de execução para assinar cada e-mail, mas não é transmitida nem exposta via API.

Publicação da chave pública no DNS

O receptor autentica a assinatura buscando a chave pública no DNS do domínio. O registro deve ser publicado como:

<selector>._domainkey.<dominio>  TXT  "v=DKIM1; k=rsa; p=<chave-pública-base64>"

Exemplo para o domínio exemplo.com com selector s1:

s1._domainkey.exemplo.com  TXT  "v=DKIM1; k=rsa; p=MIIBIjANBgkq..."

O valor de p é a chave pública RSA-2048 codificada em base64, sem cabeçalho PEM.

Como o receptor valida

  1. O MTA receptor lê o header DKIM-Signature do e-mail recebido.
  2. Extrai o selector e o domínio (d=) do header.
  3. Consulta <selector>._domainkey.<dominio> no DNS e obtém a chave pública.
  4. Recalcula o hash dos headers assinados com a canonicalização indicada.
  5. Verifica a assinatura usando a chave pública.

Se a verificação passar, o e-mail é autenticado como enviado por um servidor com acesso à chave privada do domínio.

Próximos passos

  • Configurar DNS — como publicar o registro TXT da chave pública.
  • mxout-keygen — ferramenta para gerar o par de chaves RSA-2048.
By Borlot.com.br on 01/06/2026