1

XmlDsigEnvelopedSignatureTransformを使用 して、RSA 秘密鍵を使用して XML ファイルにデジタル署名しています。

ただし、本当に必要なのは、「エンベロープ」署名を使用して 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));

}
4

1 に答える 1

4

署名が署名済みデータのサブ要素でない場合、Enveloped Signature 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();
} 
于 2012-02-09T19:25:02.603 に答える