Desenvolvimento - C#

Validar assinatura digital da NF-e

Para validarmos a assinatura digital de uma NF-e recebida de fornecedores, temos que primeiramente validar se o arquivo veio no leiaute da distribuição de NF-e (*-procNFe.xml) que consta em qualquer manual da NF-e...

por Edson Domenech



Para validarmos a assinatura digital de uma NF-e recebida de fornecedores, temos que primeiramente validar se o arquivo veio no leiaute da distribuição de NF-e (*-procNFe.xml) que consta em qualquer manual da NF-e.

Se o XML vier nessa estrutura, temos a tag nfeProc, tag principal do XML, dentro dessa tag temos duas sub tags:

- NFe nessa tag contem todos os dados e assinatura digital da NF-e;

- protNFe nessa tag contem a autorização de uso da NF-e, fornecida pelo SEFAZ.

Para finalizar, a validação da assinatura digita da NF-e deve ser feita somente na tag NFe

Eis os métodos de validação, feito em C#

public static bool validarAssinaturaDigNFe(string fileNFe)

{

//carregar o XML da NF-e

XmlDocument xml = new XmlDocument();

xml.PreserveWhitespace = true;

xml.Load(fileNFe);

if (xml.GetElementsByTagName("NFe").Count != 0)

{

return CheckSignatureNFe(xml.GetElementsByTagName("NFe"));

}

else

{

return false;

}

}

private static bool CheckSignatureNFe(XmlNodeList tagVal)

{

//pegar a Tag "NFe", à que contem assinatura dig.

XmlNodeList nodeNFe = tagVal;

string NFe = nodeNFe[0].OuterXml.ToString();

//carregar o XML da NFe

XmlDocument xmlNFe = new XmlDocument();

xmlNFe.PreserveWhitespace = true;

xmlNFe.LoadXml(NFe);

//Carregar a assinatura

SignedXml signedXml = new SignedXml(xmlNFe);

XmlNodeList nodeList = xmlNFe.GetElementsByTagName("Signature");

signedXml.LoadXml((XmlElement)nodeList[0]);

//buscar o KeyInfo da assinatura

IEnumerator keyInfoItems = signedXml.KeyInfo.GetEnumerator();

keyInfoItems.MoveNext();

KeyInfoX509Data keyInfoX509 = (KeyInfoX509Data)keyInfoItems.Current;

//buscar o certificado do KeyInfo

X509Certificate2 keyInfoCert = (X509Certificate2)keyInfoX509.Certificates[0];

//Validar se assinatura é valida

return signedXml.CheckSignature(keyInfoCert.PublicKey.Key);

}

Edson Domenech

Analista e Programador de Sistema

Edson Domenech

Edson Domenech