Я пытаюсь подписать документ XML с помощью цифровой подписи. У меня установлен сертификат, и результат, похоже, похож на спецификацию (EXCEPT пространство имен, которое, похоже, я не могу коснуться в .NET), однако я не могу получить WebService, я посылаю это, чтобы принять это, и он возвращается с ошибкой:Проблемы с SignedXML в .NET
VerifyXml: Проверка не удалась: Подпись не является действительным
Я нЕ контроль этого WebService и поставщика этой услуги утверждает, что другие люди не имеют никаких проблем с этим WebService.
Я также попытался с помощью этого инструмента проверки:
http://www.aleksey.com/xmlsec/xmldsig-verifier.html
Который возвращает ошибку: данные не совпадают: подписи не совпадают, следовательно, я думаю, что я делаю что-то неправильно.
Мой код выглядит следующим образом:
X509Store store = new X509Store(StoreName.My);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 cert = store.Certificates.Find(X509FindType.FindByThumbprint, "xxxxxx",
true).OfType<X509Certificate2>().FirstOrDefault();
store.Close();
XmlDocument xmlDoc = new XmlDocument();
XmlNamespaceManager namespaces = new XmlNamespaceManager(xmlDoc.NameTable);
namespaces.AddNamespace("ns", "xxxx");
xmlDoc.PreserveWhitespace = false;
xmlDoc.Load(new XmlTextReader("C:\\Development\\testheader.xml"));
SignedXml signedXml = new SignedXml(xmlDoc);
signedXml.SigningKey = cert.PrivateKey;
Reference reference = new Reference();
reference.Uri = "";
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
XmlDsigC14NTransform c14n = new XmlDsigC14NTransform();
reference.AddTransform(c14n);
signedXml.AddReference(reference);
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(cert));
signedXml.KeyInfo = keyInfo;
signedXml.ComputeSignature();
XmlNode parentNode = xmlDoc.SelectSingleNode("/ns:TopLevelNode", namespaces);
parentNode.InsertAfter(xmlDoc.ImportNode(signedXml.GetXml(), true),
parentNode.FirstChild);
if (xmlDoc.FirstChild is XmlDeclaration)
xmlDoc.RemoveChild(xmlDoc.FirstChild);
XmlTextWriter xmltw = new XmlTextWriter("C:\\Development\\test2.xml",
new UTF8Encoding(false));
xmlDoc.WriteTo(xmltw);
xmltw.Close();
Я попытался подтверждением SignedXML в .NET, и это, кажется, для проверки, но так как это язык написано в, я не прикладывая к большому доверию в этом.
Моя спецификация выглядит следующим образом:
<Signature xmlns="NonStandard">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>…</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>…</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>…</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
Могу ли я сделать что-то явно не так? Я не уверен, насколько важно пространство имен в отношении подписания XML, но поскольку это похоже на .NET, «установленный в камне», я сомневаюсь, что это может быть так?