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 DomenechPara 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