Mensagem de erro
dkim=fail reason="signature verification failed"
Também aparece como
- dkim=fail (bad signature)
O OpenDKIM grava `dkim=fail reason="signature verification failed"` tanto para alterações nos cabeçalhos quanto no corpo (reproduzido com o OpenDKIM 2.11.0). O mailauth diferencia as duas: “bad signature” para os cabeçalhos, “body hash did not verify” para o corpo.
O que significa
O servidor receptor encontrou a chave DKIM e calculou a assinatura sobre a mensagem tal como ela chegou, e o resultado não conferiu: os cabeçalhos assinados (ou, no caso do OpenDKIM, também o corpo) mudaram depois que o remetente assinou a mensagem, ou a chave publicada não forma par com a chave de assinatura. O DKIM assina os bytes exatos após a canonicalização, então qualquer reescrita feita por um servidor de retransmissão — uma tag no assunto, um rodapé, uma parte MIME recodificada — quebra a assinatura. Para o DMARC, isso conta como uma verificação DKIM com falha.
Por que acontece
Um servidor de retransmissão alterou um cabeçalho assinado
comumListas de discussão que acrescentam uma tag ao Subject (`[team]`), gateways que reescrevem `From` ou `To`, ou equipamentos de segurança que alteram `Content-Type`. Todos os cabeçalhos listados em `h=` estão cobertos pela assinatura.
Rodapés, avisos legais ou mudança de codificação
comumAvisos legais acrescentados, reescrita de links, banners de antivírus ou a conversão de conteúdo de 8 bits em quoted-printable alteram o corpo. Sem `l=`, cada byte conta.
A chave no DNS não corresponde à chave de assinatura
ocasionalDepois de uma rotação de chaves, o registro TXT do seletor ainda contém a chave pública antiga, ou dois servidores assinam com o mesmo seletor, mas com chaves privadas diferentes.
O signatário modificou a mensagem depois de assiná-la
ocasionalAssinar antes que um filtro de conteúdo adicione cabeçalhos ou reescreva a mensagem (ordem dos milters no Postfix), ou uma biblioteca do remetente que assina e depois altera as terminações de linha.
Como corrigir
- 1.
Comparar os cabeçalhos assinados com os recebidos
A tag `h=` lista o que foi assinado. Compare esses cabeçalhos na cópia recebida com uma cópia obtida no remetente (pasta de enviados).
bash # Which headers did the signature cover, and what do they look like now? grep -i "^DKIM-Signature" -A4 received.eml | grep -o "h=[^;]*" grep -iE "^(From|To|Subject|Date|Message-ID|Content-Type):" received.eml - 2.
Para listas e serviços de encaminhamento: ARC e nova assinatura
É recomendável que intermediários que precisam modificar as mensagens adicionem cabeçalhos ARC e assinem com o próprio domínio, para que os receptores ainda consigam avaliar a autenticação original.
text # Mailing list / forwarder: add ARC and re-sign with the list's own domain (Mailman 3 example) [ARC] enabled: yes authserv_id: lists.example.org domain: lists.example.org selector: arc2026 privkey: /etc/mailman3/arc.private - 3.
Verificar se a chave no DNS corresponde à chave privada
O `opendkim-testkey` confirma que o registro publicado para o seletor corresponde à chave que o signatário usa.
bash opendkim-testkey -d example.com -s sel -k /etc/opendkim/keys/sel.private -vvv # DNS record matches the private key?