none
Como assinar XML da NF-e no ASP.NET Core usando os padrões de assinatura da NF-e 4.00? RRS feed

  • Pergunta

  • Bom dia, estou desenvolvendo uma API com o ASP.NET Core, fazendo a comunicação com a Sefaz para envio da NF-e, no entanto estou tendo um problema ao assinar o XML, abaixo está o código que faz a assinatura:

    var listas = xmlAssinar.GetElementsByTagName(infosTipoOperacao.TagAssinatura);
    
                    foreach (XmlNode nodes in listas)
                    {
                        foreach (XmlNode childNodes in nodes.ChildNodes)
                        {
                            if (!childNodes.Name.Equals(infosTipoOperacao.TagAtributoId))
                            {
                                continue;
                            }
    
                            // Cria uma referência para ser assinado
                            var reference = new Reference
                            {
                                Uri = string.Empty
                            };
    
                            // Pega o uri que deve ser assinada                                       
                            var childElemen = (XmlElement)childNodes;
    
                            if (childElemen.GetAttributeNode("Id") != null)
                            {
                                reference.Uri = string.Format("#{0}", childElemen.GetAttributeNode("Id").Value);
                            }
                            else if (childElemen.GetAttributeNode("id") != null)
                            {
                                reference.Uri = string.Format("#{0}", childElemen.GetAttributeNode("id").Value);
                            }
    
                            // Cria um objeto SignedXml
                            var signedXml = new SignedXml(xmlAssinar)
                            {
                                
                                // Adicione a chave ao documento SignedXml
                                SigningKey = certificadoDigital.PrivateKey
                            };
    
                            // Adiciona uma transformação envelopada à referência
                            var env = new XmlDsigEnvelopedSignatureTransform();
                            reference.AddTransform(env);
    
                            var c14 = new XmlDsigC14NTransform();
                            reference.AddTransform(c14);
    
                            // Adiciona a referência ao objeto SignedXml
                            signedXml.AddReference(reference);
    
                            // Cria um novo objeto KeyInfo
                            var keyInfo = new KeyInfo();
    
                            // Carrega o certificado em um objeto KeyInfoX509Data e adicione-o ao objeto KeyInfo
                            keyInfo.AddClause(new KeyInfoX509Data(certificadoDigital));
    
                            // Adiciona o objeto KeyInfo ao objeto SignedXml
                            signedXml.KeyInfo = keyInfo;
                            signedXml.ComputeSignature();
    
                            // Obtém a representação XML da assinatura e salve-a em um objeto XmlElement
                            var xmlDigitalSignature = signedXml.GetXml();
    
                            // Grava o elemento no documento XML
                            nodes.AppendChild(xmlAssinar.ImportNode(xmlDigitalSignature, true));
                        }
                    }
    
                    xmlAssinar.PreserveWhitespace = false;
    
                    return xmlAssinar;

    Este código eu também utilizo no ASP.NET Framework e funciona normalmente, porém ao utilizar o Core, na validação da NFe me retorna o seguinte erro:

    "The value of the 'Algorithm' attribute does not equal its fixed value"

    ou

    "O valor do atributo 'Algoritmo' não é igual ao seu valor fixo"

    Foi então que percebi que dentro do objeto "PrivateKey" no Certificado Digital tem um retorno diferente do retorno do Framework e creio que isso está afetando o algoritmo que faz assinatura.

    Se alguém tiver alguma sugestão, ficarei grato desde já.



    • Editado LeoFonSilva quarta-feira, 12 de setembro de 2018 15:45
    quarta-feira, 12 de setembro de 2018 14:49

Respostas

  • Boa noite. Tudo bem?

    Obrigado por usar o fórum MSDN.

    Conseguiu algum avanço no teu caso? 

    Se ainda não, o que precisa?

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 14 de setembro de 2018 22:07
    Moderador
  • Boa tarde,

    Por falta de retorno essa thread está encerrada.

    Se necessário favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 28 de setembro de 2018 20:13
    Moderador

Todas as Respostas

  • Boa noite. Tudo bem?

    Obrigado por usar o fórum MSDN.

    Conseguiu algum avanço no teu caso? 

    Se ainda não, o que precisa?

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 14 de setembro de 2018 22:07
    Moderador
  • Boa tarde,

    Por falta de retorno essa thread está encerrada.

    Se necessário favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 28 de setembro de 2018 20:13
    Moderador