Usuário com melhor resposta
Assinar XML SHA1 em vez de SHA256

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