Моя схема выглядит следующим образом:
Код: Выделить всё
Код: Выделить всё
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;
}

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