- 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:
- 2010-02-02 - 2Gv0.0 - Versão preliminar.
- 2011-04-03 - 2Gv0.6d - Revisão de Texto.
- 2011-10-15 - 2Gv0.8b - Revisão de Texto.
- 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