Как подписать XML-документ, созданный с помощью XmlSerializer и автоматически созданных классов из xsd.exeC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как подписать XML-документ, созданный с помощью XmlSerializer и автоматически созданных классов из xsd.exe

Сообщение Anonymous »

У меня возникли проблемы с подписанием XML-файла, созданного с использованием автоматически созданных классов с помощью xsd.exe в схеме XML.
Моя схема выглядит следующим образом: Я создаю подписанный XML следующим образом:

Код: Выделить всё

static void Main(string[] args)
{

PackageEnvelope packageEnvelope = new PackageEnvelope
{
Package = new PackageEnvelopePackage
{
AdditionalElement = true,
Message = "Some message",
Status = 1
}
// , Signature = 
};

XmlSerializer xmlSerializer = new XmlSerializer(typeof(PackageEnvelope));

using (var fileStream = File.Create("D://Project//TestCreatedXml.xml"))
{
xmlSerializer.Serialize(fileStream, packageEnvelope);
};

System.Console.WriteLine("Finished !");

XmlDocument doc = new XmlDocument();
doc.Load("D://Project//TestCreatedXml.xml");

var cert = GetSignature();

doc = SignXml(doc, cert);

doc.Save("D://Project//SignedTestCreatedXml.xml");
}

public static X509Certificate2 GetSignature()
{
X509Certificate2 cert;

using (X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine))
{
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

var certificates = store.Certificates.Find(X509FindType.FindByThumbprint, "xxxxxxxx", true);

if (certificates.Count != 1)
{
throw new Exception("Certificate not found!");
}

cert = certificates[0];
}

return cert;
}

public static XmlDocument SignXml(XmlDocument doc, X509Certificate2 cert)
{
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(cert, X509IncludeOption.WholeChain));

SignedXml signedXml = new SignedXml(doc)
{
SigningKey = cert.GetRSAPrivateKey(),
KeyInfo = keyInfo
};

Reference reference = new Reference()
{
Uri = ""
};

reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
reference.AddTransform(new XmlDsigExcC14NTransform());

signedXml.AddReference(reference);

signedXml.ComputeSignature();

XmlElement signatureElement = signedXml.GetXml();
doc.DocumentElement.AppendChild(doc.ImportNode(signatureElement, true));

return doc;

}
Сгенерированный подписанный XML-файл выглядит следующим образом:
Изображение

Когда я пытаюсь проверить формат документа, выдается ошибка, связанная с подписью. Элемент не объявлен, но, как видите, он есть. Я предполагаю, что когда SignedXml вычисляет подпись, он добавляет пространство имен по умолчанию к элементу Signature, как показано на рисунке, но в моей схеме TestXml.xsd уже есть импорт в http://www.w3.org/2000/09/xmldsig#.
В сгенерированном классе из xsd.exe есть поле для Элемент подписи. Я должен подписать это таким образом?

Подробнее здесь: https://stackoverflow.com/questions/789 ... -classes-f
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»