13.1. Assinatura XML
13.1.4. Validar Assinatura
13.1.3. Assinar NFC-e 4.00 [06-05-18]
« Anterior
13.2. Certificado Digital
Próximo »

13.1.4. Validar Assinatura

Validar a Assinatura Digital de um documento XML

Assinatura:

int ValidaAssinatura(string XML, out string msgResultado, out string Titular, out string CNPJ, out string NroSerie, out string Emissor, out string InicioValidade, out string FimValidade)

Descrição:

Funcionalidade para validar a assinatura digital de um documento XML.

A funcionalidade está preparada para validar uma única assinatura digital, assim documentos XML que contenham mais de uma assinatura digital não serão validados.

Além de validar a assinatura digital, são devolvidas as propriedades básicas do certificado digital utilizado na assinatura.

Parâmetros:

nome tipo fluxo descrição
XML string entrada informar o conteúdo do XML assinado que se deseja validar a assinatura, recomendamos que seja feita a conversão de UTF-8 para ANSI para arquivos XML que foram gravados em UTF-8
msgResultado string saída retorna a literal do resultado da chamada do WS
Titular string saída retorna o nome do titular do certificado digital do assinante, Ex.: NFe - Associacao NF-e:99999090910270
CNPJ string saída retorna o CNPJ do titular do certificado digital do assinante, Ex.:99999090910270
NroSerie string saída retorna o número de série certificado digital do assinante, Ex.: 313838313838
Emissor string saída retorna o nome da Autoridade Certificadora que emitiu o certificado digital do assinante, Ex.: NFe - AC Intermediaria 1
InicioValidade string saída retorna a data de início de validade do certificado digital do assinante, Ex.: 22/05/2009 14:07:03
FimValidade string saída retorna a data final de validade do certificado digital do assinante, Ex.: 02/10/2010 14:07:03

Retorno:

O resultado da chamada ValidaAssinatura devolve um o código numérico com os seguintes significados:

código Mensagem origem regra
5801 Mensagem XML com Assinatura Digital válida DLL -
5802 Erro: Documento não contém assinatura digital XML DLL -
5803 Erro: XML mal formado [Mensagem de Erro] DLL -
5804 Erro: O Documento contém mais de uma assinatura digital XML [Quantidade de assinaturas], funcionalidade não preparada para mais de uma assinatura. DLL -
5805 Erro: Mensagem XML com Assinatura Digital inválida DLL -
5806 Erro: Falha na verificação da Assinatura Digital XML, motivo=[Motivo da Falha] DLL -

Causas de Assinatura Inválida

Codificação UTF-8 x Codificação ANSI

A codificação padrão dos arquivos compartilhados é UTF-8 conforme consta da declaração XML, mas como não existe um padronização oficial do formato e as aplicações adotam codificação nativa diferente de UTF-8, é muito comum acontecer corrompimento do arquivo. A codificação UTF-8 é uma padrão multi-byte, isto é os caracteres podem ser representados com 1, 2, 3 ou 4 bytes. Os caracteres ASCII tem a mesma codificação em UTF-8, ou seja, os caractes sem acentuação tem a mesma representação em UTF-8, mas os caracteres especiais e caracteres acentuados tem codificação diversa no ANSI (codificação padrão do VB, Delphi, etc) e o UTF-8, exemplos:

Caractere símbolo código ANSI (hexadecimal) código UTF-8 (hexadecimal)
símbolo de numeral º ba c2 ba
A com til à c3 c3 83
a com til ã e3 c3 a3
cecedilha minúsculo ç e7 c3 A7
cecedilha maiúsculo Ç c7 c3 87

Assim, a desconsideração destes detalhes causa problemas no tratamento do arquivo. Se lermos um arquivo que foi gravado com codificação UTF-8 sem fazer a conversão da codificação para ANSI, vamos ter um arquivo corrompido e com assinatura digital inválida, pois ao invés de termos o numeral "º" (ba em hexadecimal) vamos ter o "º" (c2 ba em hexadecimal).

Divergência com o validador on-line da SEFAZ/RS e Programa Visualizador do RFB

Recebi uma NF-e com respectivo protocolo de autorização de uso e a funcionalidade diz que a assinatura é inválida, mas tanto o Validor on-line da SEFAZ/RS como programa Visualizador da RFB consideram a assinatura válida.

Tanto o validador on-line da SEFAZ/RS como o visualizador da RFB "relevam alguns detalhes" que comprometem a validade da assinatua digital XML, o principal "pecado" deles é fazer a "normalização" dos namespaces, isto é, a validação é realizada considerando apenas o namespace do projeto na tag NF-e.

Utilize o AssinaDoc - validador de assinaturas da RFB que utiliza o critério correto de validação de arquivos XML para comprovar que arquivos com assinatura digital considerada válidas pelo validador on-line da SEFAZ/RS e pelo visualizador da RFB são inválidas.

Muitos usuários tem gerado o procNFe (nfeProc) acrescentando namespaces estranhos ao projeto, exemplo:

<?xml version="1.0" encoding="UTF-8" ?>
<nfeProc xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" versao="2.00">
   <NFe xmlns="http://www.portalfiscal.inf.br/nfe">
     (...)
   </NFe>
   <protNFe>
     (...)
   </protNFe>
</nfeProc>

Neste exemplo, a validação realizada neste XML vai considerar todos os namespace que existem no elemento raiz nfeProc tornando inválida a assinatura digital da tag NFe que foi realizada somente com o namespace padrão do projeto. Para evitar este tipo de problema, o XML deve ter somente o namespace padrão do projeto:

<?xml version="1.0" encoding="UTF-8" ?>
<nfeProc xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00">
   <NFe xmlns="http://www.portalfiscal.inf.br/nfe">
     (...)
   </NFe>
   <protNFe>
     (...)
   </protNFe>
</nfeProc>

A eliminação dos namespace estranhos deve solucionar o problema.

Histórico de atualização:

13.1.4. Validar Assinatura
13.1. Assinatura XML
« Anterior
13.1.3. Assinar NFC-e 4.00 [06-05-18]
Próximo »
13.2. Certificado Digital