2013-09-17 3 views
0

Я пытаюсь подписать документ 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, «установленный в камне», я сомневаюсь, что это может быть так?

ответ

0

Вышеупомянутый код работает по назначению, только если кто-то хочет знать, как подписать XML (кроме многочисленных примеров, которые уже есть). В WebService возникла проблема.

С уважением Andreas

Смежные вопросы