Здравствуйте. Я пишу свою программу на VB.Net которая отправляет в SOAP запросе- подписанный при помощи ЭЦП xml .
Но подписав я получаю ответ от сервера - ошибку проверки подписи XML.
До подписи xml выглядит так:
<XML>
<data>
.......
......
</data>
в результате подписания должен выглядеть так:
<XML>
<data>
.......
......
</data>
<ds:Signature xmlns:ds="
www.w3.org/2000/09/xmldsig#" Id="1">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="
www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="
www.w3.org/2001/04/xmldsig-more#rsa-sha1"/>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="
www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="
www.w3.org/TR/2001/REC-xml-c14n-20010315...hComments"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="
www.w3.org/2001/04/xmldsig-more#sha1"/>
<ds:DigestValue>dR.....7...E=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>VaL.......=</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIIIE........G</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
</XML>
После подписи у меня отсутствует префикс "ds:" , и разные SignatureValue , если сравнивать с сторонней программой которая подписывает xml - которую принимает сервер.Этот префикс должен присутствовать в подписи обязательно.
Префикс ds: я прописываю в ручную в VB.NET каждой ноде - вот только не знаю правильно это или нет.
Не могли бы вы мне помочь разобраться или прислать пример кода, как подписать xml средствами VB.NET или C# ???
Очень прошу вашей помощи.
Вот код которым я подписываю:
Dim cert As New X509Certificate2
cert.Import("C:\cert\GOST.p12", "123456", X509KeyStorageFlags.MachineKeySet)
Dim xmlDoc As New XmlDocument()
xmlDoc.Load("XMLFile1.xml")
Dim signedXml As New SignedXml(xmlDoc)
signedXml.SigningKey = cert.PrivateKey
' Create a reference to be signed.
Dim reference As New Reference()
reference.Uri = ""
Dim env As New XmlDsigEnvelopedSignatureTransform()
reference.AddTransform(env)
Dim trns As XmlDsigC14NWithCommentsTransform = New XmlDsigC14NWithCommentsTransform()
reference.AddTransform(trns)
signedXml.AddReference(reference)
signedXml.ComputeSignature()
Dim keyInfo As New KeyInfo()
keyInfo.AddClause(New KeyInfoX509Data(cert))
signedXml.KeyInfo = keyInfo
Dim xmlDigitalSignature As XmlElement = signedXml.GetXml()
xmlDigitalSignature.Prefix = "ds"
xmlDigitalSignature.ChildNodes(0).Prefix = "ds"
xmlDigitalSignature.ChildNodes(0).ChildNodes(0).Prefix = "ds"
xmlDigitalSignature.ChildNodes(0).ChildNodes(1).Prefix = "ds"
xmlDigitalSignature.ChildNodes(0).ChildNodes(2).Prefix = "ds"
xmlDigitalSignature.ChildNodes(0).ChildNodes(2).ChildNodes(0).Prefix = "ds"
xmlDigitalSignature.ChildNodes(0).ChildNodes(2).ChildNodes(0).ChildNodes(0).Prefix = "ds"
xmlDigitalSignature.ChildNodes(0).ChildNodes(2).ChildNodes(0).ChildNodes(1).Prefix = "ds"
xmlDigitalSignature.ChildNodes(0).ChildNodes(2).ChildNodes(1).Prefix = "ds"
xmlDigitalSignature.ChildNodes(0).ChildNodes(2).ChildNodes(2).Prefix = "ds"
xmlDigitalSignature.ChildNodes(1).Prefix = "ds"
xmlDigitalSignature.ChildNodes(2).Prefix = "ds"
xmlDigitalSignature.ChildNodes(2).ChildNodes(0).Prefix = "ds"
xmlDigitalSignature.ChildNodes(2).ChildNodes(0).ChildNodes(0).Prefix = "ds"
xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, True))
xmlDoc.Save("good.xml")