2012-02-09 2 views
1

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

Однако, я действительно хочу, чтобы подписать 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)); 

} 

ответ

3

Если ваша подпись не является суб-элементом подписанного данных, не нужно Enveloped Подпись Transform.

Так просто пропустить 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(); 
} 
+0

Как я могу это сделать? Я вставил свой код выше. Можете ли вы показать мне, как это сделать? – Ian

+0

@Ian: Я добавил несколько примеров кода. –