none
Assinar XML SHA1 em vez de SHA256 RRS feed

  • Pergunta

  • Estou tentando assinar um xml, porém ele está assinando por SHA256, e está me retornando erro, que de nenhuma forma eu corrijo, como assinar um xml com SHA1 ? Alguém tem algum exemplo ?

    Estou fazendo desta forma:

    private void AssinarXml(string arquivo, string tagAssinatura, string tagAtributoId, X509Certificate2 x509Cert)
    {
        StreamReader SR = null;
    
        try
        {
            SR = System.IO.File.OpenText(arquivo);
            string xmlString = SR.ReadToEnd();
            SR.Close();
            SR = null;
    
            // Create a new XML document.
            XmlDocument doc = new XmlDocument();
    
            // Format the document to ignore white spaces.
            doc.PreserveWhitespace = false;
    
            // Load the passed XML file using it’s name.
            doc.LoadXml(xmlString);
    
            if (doc.GetElementsByTagName(tagAssinatura).Count == 0)
            {
                throw new Exception("A tag de assinatura " + tagAssinatura.Trim() + " não existe no XML. (Código do Erro: 5)");
            }
            else if (doc.GetElementsByTagName(tagAtributoId).Count == 0)
            {
                throw new Exception("A tag de assinatura " + tagAtributoId.Trim() + " não existe no XML. (Código do Erro: 4)");
            }
            else
            {
                XmlDocument XMLDoc;
    
                XmlNodeList lists = doc.GetElementsByTagName(tagAssinatura);
                foreach (XmlNode nodes in lists)
                {
                    foreach (XmlNode childNodes in nodes.ChildNodes)
                    {
                        if (!childNodes.Name.Equals(tagAtributoId))
                            continue;
    
                        if (childNodes.NextSibling != null && childNodes.NextSibling.Name.Equals("Signature"))
                            continue;
    
                        // Create a reference to be signed
                        Reference reference = new Reference();
                        reference.Uri = "";
    
                        XmlElement childElemen = (XmlElement)childNodes;
                        if (childElemen.GetAttributeNode("Id") != null)
                        {
                            reference.Uri = ""; // "#" + childElemen.GetAttributeNode("Id").Value;
                        }
                        else if (childElemen.GetAttributeNode("id") != null)
                        {
                            reference.Uri = "#" + childElemen.GetAttributeNode("id").Value;
                        }
    
                        // Create a SignedXml object.
                        SignedXml signedXml = new SignedXml(doc);
    
                        // Add the key to the SignedXml document
                        signedXml.SigningKey = x509Cert.PrivateKey;
    
                        // Add an enveloped transformation to the reference.
                        XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
                        reference.AddTransform(env);
    
                        XmlDsigC14NTransform c14 = new XmlDsigC14NTransform();
                        reference.AddTransform(c14);
    
                        // Add the reference to the SignedXml object.
                        signedXml.AddReference(reference);
    
                        // Create a new KeyInfo object
                        KeyInfo keyInfo = new KeyInfo();
    
                        // Load the certificate into a KeyInfoX509Data object
                        // and add it to the KeyInfo object.
                        keyInfo.AddClause(new KeyInfoX509Data(x509Cert));
    
                        // Add the KeyInfo object to the SignedXml object.
                        signedXml.KeyInfo = keyInfo;
                        signedXml.ComputeSignature();
    
                        // Get the XML representation of the signature and save
                        // it to an XmlElement object.
                        XmlElement xmlDigitalSignature = signedXml.GetXml();
    
                        nodes.AppendChild(doc.ImportNode(xmlDigitalSignature, true));
                    }
                }
    
                XMLDoc = new XmlDocument();
                XMLDoc.PreserveWhitespace = false;
                XMLDoc = doc;
    
                string conteudoXMLAssinado = XMLDoc.OuterXml;
    
                using (StreamWriter sw = System.IO.File.CreateText(arquivo))
                {
                    sw.Write(conteudoXMLAssinado);
                    sw.Close();
                }
            }
        }
        finally
        {
            if (SR != null)
                SR.Close();
        }
    }

    Porém ele assina, só que com SHA256, e eu queria que ele assinasse em SHA1.

    terça-feira, 27 de novembro de 2018 10:25

Respostas

  • Consegui resolver, inclui essas duas linhas na função e deu certo:

    signedXml.SignedInfo.SignatureMethod = SignedXml.XmlDsigRSASHA1Url;
                                reference.DigestMethod = SignedXml.XmlDsigSHA1Url;

    • Marcado como Resposta Mariana C. Costa sexta-feira, 7 de dezembro de 2018 10:33
    sexta-feira, 7 de dezembro de 2018 10:32

Todas as Respostas

  • Boa tarde, Mariana C. Costa. Tudo bem?

    Obrigado por usar o fórum MSDN.

    Conseguiu algum avanço no teu caso? O que ainda 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.

    quinta-feira, 6 de dezembro de 2018 19:53
    Moderador
  • Consegui resolver, inclui essas duas linhas na função e deu certo:

    signedXml.SignedInfo.SignatureMethod = SignedXml.XmlDsigRSASHA1Url;
                                reference.DigestMethod = SignedXml.XmlDsigSHA1Url;

    • Marcado como Resposta Mariana C. Costa sexta-feira, 7 de dezembro de 2018 10:33
    sexta-feira, 7 de dezembro de 2018 10:32