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