Esse erro indica que o hash assinado no XML não confere com o hash recalculado pelo validador. Isso pode ocorrer quando:
-
O conteúdo do XML foi alterado após a assinatura;
-
O cálculo do campo hash não seguiu exatamente as regras definidas no layout;
-
A assinatura foi feita sobre um conteúdo diferente do esperado (ex.: espaços em branco, ordem de elementos ou caracteres inválidos).
Como corrigir:
-
Gere novamente o hash com base no conteúdo exato do XML.
-
Refaça a assinatura digital sobre esse hash.
-
Antes de reenviar, valide a assinatura usando o serviço oficial da Receita Federal:
Validador de Assinaturas da RFB.
Este erro pode estar relacionado a algum caractere especial que está sendo introduzido no corpo do XML. Muitas vezes fica imperceptível porque o mesmo pode estar armazenado no DB e sutilmente é introduzido ao conteúdo. Quando ocorreu comigo existia uma caractere “emoji” em uma das descrições do serviço. Neste caso, é necessário fazer uma normalização das “strings” antes de realizar a assinatura.
2 curtidas
Como o documento gerado deve estar no formato UTF-8, caracteres símbolos e outros deveriam ser convertidos em utf-8 (geram 2 bytes) e assinados.
Neste caso, não deveria gerar erro se o arquivo for convertido em UTF-8 antes da assinatura.
A normalização do documentos e correta conversao evitam dores de cabeça em assinaturas.
A tag de instrução de processamento (processing instruction (PI)) no cabeçalho do XML indica ao parser qual o tipo de codificação de página será gerado o XML. Se gerar um XML manipulando strings e somente colocar no cabeçalho o encoding=“UTF-8”, quando recebido no servidor, será feito o parser e caracteres não convertidos em UTF-8 irão gerar assinaturas diferentes e rejeitar o documento.
O PI serve justamente para orientar o parser da ferramente para carregar o documento corretamente. Caso tenha dúvidas des fluxo, melhor executar uma rotina para remover caracteres por codificação (Enconding), o que evita erros de assinatura.
Caso queira fazer um teste fácil, abra o arquivo no NotePad++ e veja a opção de Codificação para Ansi e UTF-8 para ver os resultados. Converta para HEX editor e note que caracteres como um símbolo ‘º’ ou ‘ª’ em uft-8 são gerados com 2 bytes, mas que visualmente pode não ver isto no editor pois ele facilita esta codificação para você… fica a dica.
Fica a dica do Gilberto para garantir a remoção de caracteres não visíveis/simbolos para evitar dores de cabeça ou cuidar da Codificação corretamente.
Att, Emir
1 curtida