XML DSIG: преобразование сигнатур в .NET - PullRequest
1 голос
/ 09 февраля 2012

Я использую XmlDsigEnvelopedSignatureTransform для цифровой подписи XML-файла с использованием закрытого ключа RSA.

Однако, что я действительно хочу, так это подписать xml с помощью "обволакивающей" подписи,Есть ли в .NET встроенная поддержка для этого?

Кстати, вот мой код:

public static void SignXml(XmlDocument xmlDoc, RSA key)
{
    // Check arguments.
    if (xmlDoc == null)
        throw new ArgumentException("xmlDoc");
    if (key == null)
        throw new ArgumentException("Key");

    SignedXml xml = new SignedXml(xmlDoc);            
    xml.SigningKey = key;

    Reference reference = new Reference();
    reference.Uri = "";

    XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform(true);                        

    reference.AddTransform(env);

    xml.AddReference(reference);

    xml.ComputeSignature();

    XmlElement element = xml.GetXml();

    MessageBox.Show(element.OuterXml);

    xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(element, true));

}

1 Ответ

4 голосов
/ 09 февраля 2012

Если ваша подпись не является подэлементом подписанных данных, вам не требуется преобразование с подписью в конвертах.

Так что просто пропустите XmlDsigEnvelopedSignatureTransform и выполните подпись, как в противном случае:

public XmlElement SignXml(XmlDocument xmlDoc, RSA key)
{
  SignedXml xml = new SignedXml();            
  xml.SigningKey = key;

  // Add the data to be signed as a sub-element of the Signature-element:
  DataObject dataObject = new DataObject();
  dataObject.Data = xmlDoc.ChildNodes;
  dataObject.Id = "doc";
  xml.AddObject(dataObject);

  // Add a reference to the signed data:
  Reference reference = new Reference();
  reference.Uri = "#doc";
  xml.AddReference(reference);  

  // Perform the signature. No transforms are needed.
  xml.ComputeSignature();

  return xml.GetXml();
} 
...