Я пытаюсь подписать Xml (фактически SOAP xml) на С#, используя ссылку SignedXml class, этап подписания проходит успешно, но когда я пытаюсь проверить подпись, она сообщает мне, что она недействительна. Единственное изменение, которое я сделал по сравнению с примером в MSDN, который я использовал XmlDsigExcC14NTransform вместо преобразования XmlDsigEnvelopedSignatureTransform. Если я использую XmlDsigEnvelopedSignatureTransform, я получу действительную подпись.
Вот мой код подписи:
private static XmlDocument SignXml(XmlDocument doc)
{
SignedXml signedXml = new SignedXml(doc);
signedXml.SigningKey = Certificate.PrivateKey;
Reference reference = new Reference();
reference.Uri = "";
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
//XmlDsigExcC14NTransform env = new XmlDsigExcC14NTransform();
reference.AddTransform(env);
signedXml.AddReference(reference);
signedXml.ComputeSignature();
XmlElement signature = signedXml.GetXml();
doc.DocumentElement.AppendChild(signature);
doc.Save(SignedXmlPath);
return doc;
}
Приведенный выше код даст мне действительную подпись, но если я использую
XmlDsigExcC14NTransform env = new XmlDsigExcC14NTransform();
вместо
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
Я получу недействительную подпись.
Вот мой проверочный код:
private static bool Verify(XmlDocument doc)
{
SignedXml signedDoc = new SignedXml(doc);
XmlNodeList nodeList = doc.GetElementsByTagName(Constants.SignatureElement);
signedDoc.LoadXml((XmlElement)nodeList[0]);
return signedDoc.CheckSignature((RSA)Certificate.PublicKey.Key);
}
Может ли кто-нибудь сказать мне, как я могу подписать алгоритм преобразования http://www.w3.org/2001/10/xml-exc-c14n#
Заранее спасибо.