SignedXml クラス

定義

コア XML 署名オブジェクトのラッパーを提供して、XML 署名の作成を容易にします。Provides a wrapper on a core XML signature object to facilitate creating XML signatures.

public ref class SignedXml
public class SignedXml
type SignedXml = class
Public Class SignedXml
継承
SignedXml

次のコード例は、エンベロープ署名を使用して XML ドキュメント全体を署名および検証する方法を示しています。The following code example shows how to sign and verify an entire XML document using an enveloped signature.

//
// This example signs an XML file using an
// envelope signature. It then verifies the 
// signed XML.
//
#using <System.Security.dll>
#using <System.Xml.dll>

using namespace System;
using namespace System::Security::Cryptography;
using namespace System::Security::Cryptography::X509Certificates;
using namespace System::Security::Cryptography::Xml;
using namespace System::Text;
using namespace System::Xml;

// Sign an XML file and save the signature in a new file. This method does not  
// save the public key within the XML file.  This file cannot be verified unless  
// the verifying code has the key with which it was signed.
void SignXmlFile( String^ FileName, String^ SignedFileName, RSA^ Key )
{
   
   // Create a new XML document.
   XmlDocument^ doc = gcnew XmlDocument;
   
   // Load the passed XML file using its name.
   doc->Load( gcnew XmlTextReader( FileName ) );
   
   // Create a SignedXml object.
   SignedXml^ signedXml = gcnew SignedXml( doc );
   
   // Add the key to the SignedXml document. 
   signedXml->SigningKey = Key;
   
   // Create a reference to be signed.
   Reference^ reference = gcnew Reference;
   reference->Uri = "";
   
   // Add an enveloped transformation to the reference.
   XmlDsigEnvelopedSignatureTransform^ env = gcnew XmlDsigEnvelopedSignatureTransform;
   reference->AddTransform( env );
   
   // Add the reference to the SignedXml object.
   signedXml->AddReference( reference );
   
   // Compute the signature.
   signedXml->ComputeSignature();
   
   // Get the XML representation of the signature and save
   // it to an XmlElement object.
   XmlElement^ xmlDigitalSignature = signedXml->GetXml();
   
   // Append the element to the XML document.
   doc->DocumentElement->AppendChild( doc->ImportNode( xmlDigitalSignature, true ) );
   if ( (doc->FirstChild)->GetType() == XmlDeclaration::typeid )
   {
      doc->RemoveChild( doc->FirstChild );
   }

   
   // Save the signed XML document to a file specified
   // using the passed string.
   XmlTextWriter^ xmltw = gcnew XmlTextWriter( SignedFileName,gcnew UTF8Encoding( false ) );
   doc->WriteTo( xmltw );
   xmltw->Close();
}


// Verify the signature of an XML file against an asymmetric 
// algorithm and return the result.
Boolean VerifyXmlFile( String^ Name, RSA^ Key )
{
   
   // Create a new XML document.
   XmlDocument^ xmlDocument = gcnew XmlDocument;
   
   // Load the passed XML file into the document. 
   xmlDocument->Load( Name );
   
   // Create a new SignedXml object and pass it
   // the XML document class.
   SignedXml^ signedXml = gcnew SignedXml( xmlDocument );
   
   // Find the "Signature" node and create a new
   // XmlNodeList object.
   XmlNodeList^ nodeList = xmlDocument->GetElementsByTagName( "Signature" );
   
   // Load the signature node.
   signedXml->LoadXml( safe_cast<XmlElement^>(nodeList->Item( 0 )) );
   
   // Check the signature and return the result.
   return signedXml->CheckSignature( Key );
}


// Create example data to sign.
void CreateSomeXml( String^ FileName )
{
   
   // Create a new XmlDocument Object*.
   XmlDocument^ document = gcnew XmlDocument;
   
   // Create a new XmlNode object.
   XmlNode^ node = document->CreateNode( XmlNodeType::Element, "", "MyElement", "samples" );
   
   // Add some text to the node.
   node->InnerText = "Example text to be signed.";
   
   // Append the node to the document.
   document->AppendChild( node );
   
   // Save the XML document to the file name specified.
   XmlTextWriter^ xmltw = gcnew XmlTextWriter( FileName,gcnew UTF8Encoding( false ) );
   document->WriteTo( xmltw );
   xmltw->Close();
}

int main()
{
   try
   {
      
      // Generate a signing key.
      RSA^ Key = RSA::Create();
      
      // Create an XML file to sign.
      CreateSomeXml( "Example.xml" );
      Console::WriteLine( "New XML file created." );
      
      // Sign the XML that was just created and save it in a 
      // new file.
      SignXmlFile( "Example.xml", "signedExample.xml", Key );
      Console::WriteLine( "XML file signed." );
      
      // Verify the signature of the signed XML.
      Console::WriteLine( "Verifying signature..." );
      bool result = VerifyXmlFile( "SignedExample.xml", Key );
      
      // Display the results of the signature verification to 
      // the console.
      if ( result )
      {
         Console::WriteLine( "The XML signature is valid." );
      }
      else
      {
         Console::WriteLine( "The XML signature is not valid." );
      }
   }
   catch ( CryptographicException^ e ) 
   {
      Console::WriteLine( e->Message );
   }

}

//
// This example signs an XML file using an
// envelope signature. It then verifies the 
// signed XML.
//
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Text;
using System.Xml;

public class SignVerifyEnvelope
{

    public static void Main(String[] args)
    {
        try
        {
           // Generate a signing key.
           RSA Key = RSA.Create();

           // Create an XML file to sign.
           CreateSomeXml("Example.xml");
           Console.WriteLine("New XML file created."); 

           // Sign the XML that was just created and save it in a 
           // new file.
           SignXmlFile("Example.xml", "signedExample.xml", Key);
           Console.WriteLine("XML file signed."); 

           // Verify the signature of the signed XML.
           Console.WriteLine("Verifying signature...");
           bool result = VerifyXmlFile("SignedExample.xml", Key);

           // Display the results of the signature verification to 
           // the console.
           if(result)
           {
               Console.WriteLine("The XML signature is valid.");
           }
           else
           {
            Console.WriteLine("The XML signature is not valid.");
           }
        }
        catch(CryptographicException e)
        {
            Console.WriteLine(e.Message);
        }
    }

    // Sign an XML file and save the signature in a new file. This method does not  
    // save the public key within the XML file.  This file cannot be verified unless  
    // the verifying code has the key with which it was signed.
    public static void SignXmlFile(string FileName, string SignedFileName, RSA Key)
    {
        // Create a new XML document.
        XmlDocument doc = new XmlDocument();

        // Load the passed XML file using its name.
        doc.Load(new XmlTextReader(FileName));

        // Create a SignedXml object.
        SignedXml signedXml = new SignedXml(doc);

        // Add the key to the SignedXml document. 
        signedXml.SigningKey = Key;

        // Create a reference to be signed.
        Reference reference = new Reference();
        reference.Uri = "";

        // Add an enveloped transformation to the reference.
        XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
        reference.AddTransform(env);

        // Add the reference to the SignedXml object.
        signedXml.AddReference(reference);

        // Compute the signature.
        signedXml.ComputeSignature();

        // Get the XML representation of the signature and save
        // it to an XmlElement object.
        XmlElement xmlDigitalSignature = signedXml.GetXml();

        // Append the element to the XML document.
        doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, true));
        
        if (doc.FirstChild is XmlDeclaration)  
        {
            doc.RemoveChild(doc.FirstChild);
        }

        // Save the signed XML document to a file specified
        // using the passed string.
        XmlTextWriter xmltw = new XmlTextWriter(SignedFileName, new UTF8Encoding(false));
        doc.WriteTo(xmltw);
        xmltw.Close();
    }

    // Verify the signature of an XML file against an asymmetric 
    // algorithm and return the result.
    public static Boolean VerifyXmlFile(String Name, RSA Key)
    {
        // Create a new XML document.
        XmlDocument xmlDocument = new XmlDocument();

        // Load the passed XML file into the document. 
        xmlDocument.Load(Name);

        // Create a new SignedXml object and pass it
        // the XML document class.
        SignedXml signedXml = new SignedXml(xmlDocument);

        // Find the "Signature" node and create a new
        // XmlNodeList object.
        XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature");

        // Load the signature node.
        signedXml.LoadXml((XmlElement)nodeList[0]);

        // Check the signature and return the result.
        return signedXml.CheckSignature(Key);
    }

    // Create example data to sign.
    public static void CreateSomeXml(string FileName)
    {
        // Create a new XmlDocument object.
        XmlDocument document = new XmlDocument();

        // Create a new XmlNode object.
        XmlNode  node = document.CreateNode(XmlNodeType.Element, "", "MyElement", "samples");
        
        // Add some text to the node.
        node.InnerText = "Example text to be signed.";

        // Append the node to the document.
        document.AppendChild(node);

        // Save the XML document to the file name specified.
        XmlTextWriter xmltw = new XmlTextWriter(FileName, new UTF8Encoding(false));
        document.WriteTo(xmltw);
        xmltw.Close();
    }
}
'
' This example signs an XML file using an
' envelope signature. It then verifies the 
' signed XML.
'
Imports System.Security.Cryptography
Imports System.Security.Cryptography.X509Certificates
Imports System.Security.Cryptography.Xml
Imports System.Text
Imports System.Xml



Public Class SignVerifyEnvelope
   
   Overloads Public Shared Sub Main(args() As [String])
      Try
         ' Generate a signing key.
         Dim Key As RSA = RSA.Create()
         
         ' Create an XML file to sign.
         CreateSomeXml("Example.xml")
         Console.WriteLine("New XML file created.")
         
         ' Sign the XML that was just created and save it in a 
         ' new file.
         SignXmlFile("Example.xml", "signedExample.xml", Key)
         Console.WriteLine("XML file signed.")
         
         ' Verify the signature of the signed XML.
         Console.WriteLine("Verifying signature...")
         Dim result As Boolean = VerifyXmlFile("SignedExample.xml", Key)
         
         ' Display the results of the signature verification to 
         ' the console.
         If result Then
            Console.WriteLine("The XML signature is valid.")
         Else
            Console.WriteLine("The XML signature is not valid.")
         End If
      Catch e As CryptographicException
         Console.WriteLine(e.Message)
      End Try
   End Sub 
   
   
   
   ' Sign an XML file and save the signature in a new file. This method does not  
   ' save the public key within the XML file.  This file cannot be verified unless  
   ' the verifying code has the key with which it was signed.
   Public Shared Sub SignXmlFile(FileName As String, SignedFileName As String, Key As RSA)
      ' Create a new XML document.
      Dim doc As New XmlDocument()
      
      ' Load the passed XML file using its name.
      doc.Load(New XmlTextReader(FileName))
      
      ' Create a SignedXml object.
      Dim signedXml As New SignedXml(doc)
      
      ' Add the key to the SignedXml document. 
      signedXml.SigningKey = Key
      
      ' Create a reference to be signed.
      Dim reference As New Reference()
      reference.Uri = ""
      
      ' Add an enveloped transformation to the reference.
      Dim env As New XmlDsigEnvelopedSignatureTransform()
      reference.AddTransform(env)
      
      ' Add the reference to the SignedXml object.
      signedXml.AddReference(reference)
      
      ' Compute the signature.
      signedXml.ComputeSignature()
      
      ' Get the XML representation of the signature and save
      ' it to an XmlElement object.
      Dim xmlDigitalSignature As XmlElement = signedXml.GetXml()
      
      ' Append the element to the XML document.
      doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, True))
      
      If TypeOf doc.FirstChild Is XmlDeclaration Then
         doc.RemoveChild(doc.FirstChild)
      End If
      
      ' Save the signed XML document to a file specified
      ' using the passed string.
      Dim xmltw As New XmlTextWriter(SignedFileName, New UTF8Encoding(False))
      doc.WriteTo(xmltw)
      xmltw.Close()
   End Sub
   
   
   ' Verify the signature of an XML file against an asymmetric 
   ' algorithm and return the result.
   Public Shared Function VerifyXmlFile(Name As [String], Key As RSA) As [Boolean]
      ' Create a new XML document.
      Dim xmlDocument As New XmlDocument()
      
      ' Load the passed XML file into the document. 
      xmlDocument.Load(Name)
      
      ' Create a new SignedXml object and pass it
      ' the XML document class.
      Dim signedXml As New SignedXml(xmlDocument)
      
      ' Find the "Signature" node and create a new
      ' XmlNodeList object.
      Dim nodeList As XmlNodeList = xmlDocument.GetElementsByTagName("Signature")
      
      ' Load the signature node.
      signedXml.LoadXml(CType(nodeList(0), XmlElement))
      
      ' Check the signature and return the result.
      Return signedXml.CheckSignature(Key)
   End Function 
   
   
   
   ' Create example data to sign.
   Public Shared Sub CreateSomeXml(FileName As String)
      ' Create a new XmlDocument object.
      Dim document As New XmlDocument()
      
      ' Create a new XmlNode object.
      Dim node As XmlNode = document.CreateNode(XmlNodeType.Element, "", "MyElement", "samples")
      
      ' Add some text to the node.
      node.InnerText = "Example text to be signed."
      
      ' Append the node to the document.
      document.AppendChild(node)
      
      ' Save the XML document to the file name specified.
      Dim xmltw As New XmlTextWriter(FileName, New UTF8Encoding(False))
      document.WriteTo(xmltw)
      xmltw.Close()
   End Sub 
End Class 

次のコード例は、エンベロープ署名を使用して XML ドキュメントの1つの要素に署名して検証する方法を示しています。The following code example shows how to sign and verify a single element of an XML document using an enveloping signature.

//
// This example signs an XML file using an
// envelope signature. It then verifies the 
// signed XML.
//
#using <System.Xml.dll>
#using <System.Security.dll>
#using <System.dll>

using namespace System;
using namespace System::Security::Cryptography;
using namespace System::Security::Cryptography::Xml;
using namespace System::Text;
using namespace System::Xml;

// Sign an XML file and save the signature in a new file.
static void SignXmlFile( String^ FileName, String^ SignedFileName, RSA^ Key, array<String^>^ElementsToSign )
{
   
   // Check the arguments.  
   if ( FileName == nullptr )
      throw gcnew ArgumentNullException( L"FileName" );

   if ( SignedFileName == nullptr )
      throw gcnew ArgumentNullException( L"SignedFileName" );

   if ( Key == nullptr )
      throw gcnew ArgumentNullException( L"Key" );

   if ( ElementsToSign == nullptr )
      throw gcnew ArgumentNullException( L"ElementsToSign" );

   
   // Create a new XML document.
   XmlDocument^ doc = gcnew XmlDocument;
   
   // Format the document to ignore white spaces.
   doc->PreserveWhitespace = false;
   
   // Load the passed XML file using it's name.
   doc->Load( gcnew XmlTextReader( FileName ) );
   
   // Create a SignedXml object.
   SignedXml^ signedXml = gcnew SignedXml( doc );
   
   // Add the key to the SignedXml document. 
   signedXml->SigningKey = Key;
   
   // Loop through each passed element to sign 
   // and create a reference.
   System::Collections::IEnumerator^ myEnum = ElementsToSign->GetEnumerator();
   while ( myEnum->MoveNext() )
   {
      String^ s = safe_cast<String^>(myEnum->Current);
      
      // Create a reference to be signed.
      Reference^ reference = gcnew Reference;
      reference->Uri = s;
      
      // Add an enveloped transformation to the reference.
      XmlDsigEnvelopedSignatureTransform^ env = gcnew XmlDsigEnvelopedSignatureTransform;
      reference->AddTransform( env );
      
      // Add the reference to the SignedXml object.
      signedXml->AddReference( reference );
   }

   
   // Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate).
   KeyInfo^ keyInfo = gcnew KeyInfo;
   keyInfo->AddClause( gcnew RSAKeyValue( dynamic_cast<RSA^>(Key) ) );
   signedXml->KeyInfo = keyInfo;
   
   // Compute the signature.
   signedXml->ComputeSignature();
   
   // Get the XML representation of the signature and save
   // it to an XmlElement object.
   XmlElement^ xmlDigitalSignature = signedXml->GetXml();
   
   // Append the element to the XML document.
   doc->DocumentElement->AppendChild( doc->ImportNode( xmlDigitalSignature, true ) );
   if ( dynamic_cast<XmlDeclaration^>(doc->FirstChild) )
   {
      doc->RemoveChild( doc->FirstChild );
   }

   
   // Save the signed XML document to a file specified
   // using the passed string.
   XmlTextWriter^ xmltw = gcnew XmlTextWriter( SignedFileName,gcnew UTF8Encoding( false ) );
   doc->WriteTo( xmltw );
   xmltw->Close();
}


// Verify the signature of an XML file and return the result.
static Boolean VerifyXmlFile( String^ Name )
{
   
   // Check the arguments.  
   if ( Name == nullptr )
      throw gcnew ArgumentNullException( L"Name" );

   
   // Create a new XML document.
   XmlDocument^ xmlDocument = gcnew XmlDocument;
   
   // Format using white spaces.
   xmlDocument->PreserveWhitespace = true;
   
   // Load the passed XML file into the document. 
   xmlDocument->Load( Name );
   
   // Create a new SignedXml object and pass it
   // the XML document class.
   SignedXml^ signedXml = gcnew SignedXml( xmlDocument );
   
   // Find the "Signature" node and create a new
   // XmlNodeList object.
   XmlNodeList^ nodeList = xmlDocument->GetElementsByTagName( L"Signature" );
   
   // Load the signature node.
   signedXml->LoadXml( dynamic_cast<XmlElement^>(nodeList->Item( 0 )) );
   
   // Check the signature and return the result.
   return signedXml->CheckSignature();
}

int main()
{
   
   // Generate a signing key.
   RSA^ Key = RSA::Create();
   try
   {
      
      // Specify an element to sign. 
      array<String^>^elements = {L"#tag1"};
      
      // Sign an XML file and save the signature to a 
      // new file.
      SignXmlFile( L"Test.xml", L"SignedExample.xml", Key, elements );
      Console::WriteLine( L"XML file signed." );
      
      // Verify the signature of the signed XML.
      Console::WriteLine( L"Verifying signature..." );
      bool result = VerifyXmlFile( L"SignedExample.xml" );
      
      // Display the results of the signature verification to 
      // the console.
      if ( result )
      {
         Console::WriteLine( L"The XML signature is valid." );
      }
      else
      {
         Console::WriteLine( L"The XML signature is not valid." );
      }
   }
   catch ( CryptographicException^ e ) 
   {
      Console::WriteLine( e->Message );
   }
   finally
   {
      
      // Clear resources associated with the 
      // RSA instance.
      Key->Clear();
   }

   return 1;
}

//
// This example signs an XML file using an
// envelope signature. It then verifies the
// signed XML.
//
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Text;
using System.Xml;

public class SignVerifyEnvelope
{

    public static void Main(String[] args)
    {
        // Generate a signing key.
       RSA Key = RSA.Create();

       try
       {
           // Specify an element to sign.
           string[] elements =  { "#tag1" };

           // Sign an XML file and save the signature to a
           // new file.
           SignXmlFile("Test.xml", "SignedExample.xml", Key, elements);
           Console.WriteLine("XML file signed.");

           // Verify the signature of the signed XML.
           Console.WriteLine("Verifying signature...");

           bool result = VerifyXmlFile("SignedExample.xml");

           // Display the results of the signature verification to
           // the console.
           if (result)
           {
               Console.WriteLine("The XML signature is valid.");
           }
           else
           {
               Console.WriteLine("The XML signature is not valid.");
           }
       }
       catch (CryptographicException e)
       {
           Console.WriteLine(e.Message);
       }
       finally
       {
           // Clear resources associated with the
           // RSA instance.
           Key.Clear();
       }
   }

    // Sign an XML file and save the signature in a new file.
    public static void SignXmlFile(string FileName, string SignedFileName, RSA Key, string[] ElementsToSign)
    {
        // Check the arguments.
        if (FileName == null)
            throw new ArgumentNullException("FileName");
        if (SignedFileName == null)
            throw new ArgumentNullException("SignedFileName");
        if (Key == null)
            throw new ArgumentNullException("Key");
        if (ElementsToSign == null)
            throw new ArgumentNullException("ElementsToSign");

        // Create a new XML document.
        XmlDocument doc = new XmlDocument();

        // Format the document to ignore white spaces.
        doc.PreserveWhitespace = false;

        // Load the passed XML file using it's name.
        doc.Load(new XmlTextReader(FileName));

        // Create a SignedXml object.
        SignedXml signedXml = new SignedXml(doc);

        // Add the key to the SignedXml document.
        signedXml.SigningKey = Key;

        // Loop through each passed element to sign
        // and create a reference.
        foreach (string s in ElementsToSign)
        {
            // Create a reference to be signed.
            Reference reference = new Reference();
            reference.Uri = s;

            // Add an enveloped transformation to the reference.
            XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
            reference.AddTransform(env);

            // Add the reference to the SignedXml object.
            signedXml.AddReference(reference);
        }

        // Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate).
        KeyInfo keyInfo = new KeyInfo();
        keyInfo.AddClause(new RSAKeyValue((RSA)Key));
        signedXml.KeyInfo = keyInfo;

        // Compute the signature.
        signedXml.ComputeSignature();

        // Get the XML representation of the signature and save
        // it to an XmlElement object.
        XmlElement xmlDigitalSignature = signedXml.GetXml();

        // Append the element to the XML document.
        doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, true));

        if (doc.FirstChild is XmlDeclaration)
        {
            doc.RemoveChild(doc.FirstChild);
        }

        // Save the signed XML document to a file specified
        // using the passed string.
        XmlTextWriter xmltw = new XmlTextWriter(SignedFileName, new UTF8Encoding(false));
        doc.WriteTo(xmltw);
        xmltw.Close();
    }
    // Verify the signature of an XML file and return the result.
    public static Boolean VerifyXmlFile(String Name)
    {
        // Check the arguments.
        if (Name == null)
            throw new ArgumentNullException("Name");

        // Create a new XML document.
        XmlDocument xmlDocument = new XmlDocument();

        // Format using white spaces.
        xmlDocument.PreserveWhitespace = true;

        // Load the passed XML file into the document.
        xmlDocument.Load(Name);

        // Create a new SignedXml object and pass it
        // the XML document class.
        SignedXml signedXml = new SignedXml(xmlDocument);

        // Find the "Signature" node and create a new
        // XmlNodeList object.
        XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature");

        // Load the signature node.
        signedXml.LoadXml((XmlElement)nodeList[0]);

        // Check the signature and return the result.
        return signedXml.CheckSignature();
    }
}
' This example signs an XML file using an
' envelope signature. It then verifies the 
' signed XML.
'
Imports System.Security.Cryptography
Imports System.Security.Cryptography.Xml
Imports System.Text
Imports System.Xml



Module SignVerifyEnvelope



    Sub Main(ByVal args() As String)
        ' Generate a signing key.
        Dim Key As RSA = RSA.Create()

        Try
            ' Specify an element to sign. 
            Dim elements As String() = New String() {"#tag1"}

            ' Sign an XML file and save the signature to a 
            ' new file.
            SignXmlFile("Test.xml", "SignedExample.xml", Key, elements)
            Console.WriteLine("XML file signed.")

            ' Verify the signature of the signed XML.
            Console.WriteLine("Verifying signature...")

            Dim result As Boolean = VerifyXmlFile("SignedExample.xml")

            ' Display the results of the signature verification to \
            ' the console.
            If result Then
                Console.WriteLine("The XML signature is valid.")
            Else
                Console.WriteLine("The XML signature is not valid.")
            End If
        Catch e As CryptographicException
            Console.WriteLine(e.Message)
        Finally
            ' Clear resources associated with the 
            ' RSA instance.
            Key.Clear()
        End Try

    End Sub


    ' Sign an XML file and save the signature in a new file.
    Sub SignXmlFile(ByVal FileName As String, ByVal SignedFileName As String, ByVal Key As RSA, ByVal ElementsToSign() As String)
        ' Check the arguments.  
        If FileName Is Nothing Then
            Throw New ArgumentNullException("FileName")
        End If
        If SignedFileName Is Nothing Then
            Throw New ArgumentNullException("SignedFileName")
        End If
        If Key Is Nothing Then
            Throw New ArgumentNullException("Key")
        End If
        If ElementsToSign Is Nothing Then
            Throw New ArgumentNullException("ElementsToSign")
        End If
        ' Create a new XML document.
        Dim doc As New XmlDocument()

        ' Format the document to ignore white spaces.
        doc.PreserveWhitespace = False

        ' Load the passed XML file using it's name.
        doc.Load(New XmlTextReader(FileName))

        ' Create a SignedXml object.
        Dim signedXml As New SignedXml(doc)

        ' Add the key to the SignedXml document. 
        signedXml.SigningKey = Key

        ' Loop through each passed element to sign 
        ' and create a reference.
        Dim s As String
        For Each s In ElementsToSign
            ' Create a reference to be signed.
            Dim reference As New Reference()
            reference.Uri = s

            ' Add an enveloped transformation to the reference.
            Dim env As New XmlDsigEnvelopedSignatureTransform()
            reference.AddTransform(env)

            ' Add the reference to the SignedXml object.
            signedXml.AddReference(reference)
        Next s

        ' Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate).
        Dim keyInfo As New KeyInfo()
        keyInfo.AddClause(New RSAKeyValue(CType(Key, RSA)))
        signedXml.KeyInfo = keyInfo

        ' Compute the signature.
        signedXml.ComputeSignature()

        ' Get the XML representation of the signature and save
        ' it to an XmlElement object.
        Dim xmlDigitalSignature As XmlElement = signedXml.GetXml()

        ' Append the element to the XML document.
        doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, True))


        If TypeOf doc.FirstChild Is XmlDeclaration Then
            doc.RemoveChild(doc.FirstChild)
        End If

        ' Save the signed XML document to a file specified
        ' using the passed string.
        Dim xmltw As New XmlTextWriter(SignedFileName, New UTF8Encoding(False))
        doc.WriteTo(xmltw)
        xmltw.Close()

    End Sub

    ' Verify the signature of an XML file and return the result.
    Function VerifyXmlFile(ByVal Name As String) As [Boolean]
        ' Check the arguments.  
        If Name Is Nothing Then
            Throw New ArgumentNullException("Name")
        End If
        ' Create a new XML document.
        Dim xmlDocument As New XmlDocument()

        ' Format using white spaces.
        xmlDocument.PreserveWhitespace = True

        ' Load the passed XML file into the document. 
        xmlDocument.Load(Name)

        ' Create a new SignedXml object and pass it
        ' the XML document class.
        Dim signedXml As New SignedXml(xmlDocument)

        ' Find the "Signature" node and create a new
        ' XmlNodeList object.
        Dim nodeList As XmlNodeList = xmlDocument.GetElementsByTagName("Signature")

        ' Load the signature node.
        signedXml.LoadXml(CType(nodeList(0), XmlElement))

        ' Check the signature and return the result.
        Return signedXml.CheckSignature()

    End Function
End Module

注釈

クラスは、 SignedXml World Wide Web コンソーシアム (W3C) XML 署名構文と処理仕様の .net 実装であり、XMLDSIG (xml デジタル署名) とも呼ばれます。The SignedXml class is the .NET implementation of the World Wide Web Consortium (W3C) XML Signature Syntax and Processing Specification, also known as XMLDSIG (XML Digital Signature). XMLDSIG は、標準ベースで相互運用可能な方法で、XML ドキュメントのすべてまたは一部、または Uniform Resource Identifier (URI) からアドレス指定できるその他のデータの署名と検証を行うことができます。XMLDSIG is a standards-based, interoperable way to sign and verify all or part of an XML document or other data that is addressable from a Uniform Resource Identifier (URI).

クラスは、 SignedXml 署名された XML データをアプリケーションまたは組織間で標準的な方法で共有する必要がある場合に使用します。Use the SignedXml class whenever you need to share signed XML data between applications or organizations in a standard way. このクラスを使用して署名されたデータは、XMLDSIG の W3C 仕様のすべての準拠実装によって検証できます。Any data signed using this class can be verified by any conforming implementation of the W3C specification for XMLDSIG.

SignedXmlクラスを使用すると、次の3種類の XML デジタル署名を作成できます。The SignedXml class allows you to create the following three kinds of XML digital signatures:

[署名の種類]Signature Type 説明Description
エンベロープ署名Enveloped signature 署名は、署名されている XML 要素内に含まれています。The signature is contained within the XML element being signed.
エンベロープ署名Enveloping signature 署名された XML は要素内に含まれ <Signature> ます。The signed XML is contained within the <Signature> element.
デタッチされた内部署名Internal detached signature 署名と署名された XML は同じドキュメント内にありますが、どちらの要素も他方を含んでいません。The signature and signed XML are in the same document, but neither element contains the other.

また、データと署名が個別の XML ドキュメントに含まれる場合、外部のデタッチされた署名と呼ばれる4つ目の種類の署名もあります。There is also a fourth kind of signature called an external detached signature which is when the data and signature are in separate XML documents. 外部のデタッチされた署名は、クラスではサポートされていません SignedXmlExternal detached signatures are not supported by the SignedXml class.

XML 署名の構造The structure of an XML Signature

XMLDSIG は <Signature> 、XML ドキュメントのデジタル署名や、URI からアドレス指定できるその他のデータを含む要素を作成します。XMLDSIG creates a <Signature> element, which contains a digital signature of an XML document or other data that is addressable from a URI. 要素には、 <Signature> 署名を検証するキーの場所や署名に使用された暗号アルゴリズムなどの情報を含めることができます。The <Signature> element can optionally contain information about where to find a key that will verify the signature and which cryptographic algorithm was used for signing. 基本的な構造は次のとおりです。The basic structure is as follows:

<Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">  
    <SignedInfo>  
      <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>  
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>  
      <Reference URI="">  
        <Transforms>  
          <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>  
        </Transforms>  
        <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>  
        <DigestValue>Base64EncodedValue==</DigestValue>  
      </Reference>  
    </SignedInfo>  
    <SignatureValue>AnotherBase64EncodedValue===</SignatureValue>  
</Signature>

この構造体の主な部分は次のとおりです。The main parts of this structure are:

  • <CanonicalizationMethod> 要素The <CanonicalizationMethod> element

    SignatureXML/テキストから署名検証用のバイトに要素を書き直すための規則を指定します。Specifies the rules for rewriting the Signature element from XML/text into bytes for signature validation. .NET の既定値は http://www.w3.org/TR/2001/REC-xml-c14n-20010315 で、信頼できるアルゴリズムを識別します。The default value in .NET is http://www.w3.org/TR/2001/REC-xml-c14n-20010315, which identifies a trustworthy algorithm. この要素は、プロパティによって表され SignedInfo.CanonicalizationMethod ます。This element is represented by the SignedInfo.CanonicalizationMethod property.

  • <SignatureMethod> 要素The <SignatureMethod> element

    <Signature>の値を生成するために要素に適用された、署名の生成および検証に使用されるアルゴリズムを指定し <SignatureValue> ます。Specifies the algorithm used for signature generation and validation, which was applied to the <Signature> element to produce the value in <SignatureValue>. 前の例では、値によって http://www.w3.org/2000/09/xmldsig#rsa-sha1 RSA PKCS1 の sha-1 署名が識別されます。In the previous example, the value http://www.w3.org/2000/09/xmldsig#rsa-sha1 identifies an RSA PKCS1 SHA-1 signature. SHA-1 との競合の問題により、Microsoft は SHA-256 以上に基づくセキュリティモデルを推奨しています。Due to collision problems with SHA-1, Microsoft recommends a security model based on SHA-256 or better. この要素は、プロパティによって表され SignatureMethod ます。This element is represented by the SignatureMethod property.

  • <SignatureValue> 要素The <SignatureValue> element

    要素の暗号化署名を指定し <Signature> ます。Specifies the cryptographic signature for the <Signature> element. この署名で検証されない場合、ブロックの一部が <Signature> 改ざんされ、ドキュメントは無効と見なされます。If this signature does not verify, then some portion of the <Signature> block was tampered with, and the document is considered invalid. <CanonicalizationMethod>値が信頼できる限り、この値は改ざんに対して非常に高い耐性を持ちます。As long as the <CanonicalizationMethod> value is trustworthy, this value is highly resistant to tampering. この要素は、プロパティによって表され SignatureValue ます。This element is represented by the SignatureValue property.

  • URI要素の属性 <Reference>The URI attribute of the <Reference> element

    URI 参照を使用してデータオブジェクトを指定します。Specifies a data object using a URI reference. この属性は、プロパティによって表され Reference.Uri ます。This attribute is represented by the Reference.Uri property.

    • 属性を指定しない場合 (つまり、プロパティをに設定する場合) は、 URI Reference.Uri null 受信側のアプリケーションがオブジェクトの id を認識している必要があることを意味します。Not specifying the URI attribute, that is, setting the Reference.Uri property to null, means that the receiving application is expected to know the identity of the object. ほとんどの場合、URI によっ null て例外がスローされます。In most cases, a null URI will result in an exception being thrown. nullアプリケーションが必要なプロトコルと相互運用している場合を除き、URI は使用しないでください。Do not use a null URI, unless your application is interoperating with a protocol which requires it.

    • 属性を URI 空の文字列に設定することは、ドキュメントのルート要素が署名されていることを示します。これは、エンベロープ署名の形式です。Setting the URI attribute to an empty string indicates that the root element of the document is being signed, a form of enveloped signature.

    • 属性の値が URI # で始まる場合、値は現在のドキュメント内の要素に解決される必要があります。If the value of URI attribute starts with #, then the value must resolve to an element in the current document. このフォームは、サポートされている任意の署名の種類 (エンベロープ署名、エンベロープ署名、または内部デタッチされた署名) で使用できます。This form can be used with any of the supported signature types (enveloped signature, enveloping signature or internal detached signature).

    • その他のものは、外部リソースのデタッチされた署名と見なされ、クラスではサポートされません SignedXmlAnything else is considered an external resource detached signature and is not supported by the SignedXml class.

  • <Transforms> 要素The <Transforms> element

    <Transform>署名者がダイジェストされたデータオブジェクトを取得した方法を記述する要素の順序付きリストを格納します。Contains an ordered list of <Transform> elements that describe how the signer obtained the data object that was digested. 変換アルゴリズムは、正規化メソッドに似ていますが、要素を書き換えるのではなく、 <Signature> 要素の属性で識別されるコンテンツをリライトし URI <Reference> ます。A transform algorithm is similar to the canonicalization method, but instead of rewriting the <Signature> element, it rewrites the content identified by the URI attribute of the <Reference> element. <Transforms>要素は、クラスによって表され TransformChain ます。The <Transforms> element is represented by the TransformChain class.

    • 各変換アルゴリズムは、XML (XPath ノードセット) またはバイト数を入力として取得するように定義されています。Each transform algorithm is defined as taking either XML (an XPath node-set) or bytes as input. 現在のデータの形式が変換入力要件と異なる場合は、変換規則が適用されます。If the format of the current data differs from the transform input requirements, conversion rules are applied.

    • 各変換アルゴリズムは、出力として XML またはバイトのいずれかを生成するように定義されています。Each transform algorithm is defined as producing either XML or bytes as the output.

    • 最後の変換アルゴリズムの出力がバイト単位で定義されていない場合 (または、変換が指定されていない場合)、 正規化メソッド は暗黙的な変換として使用されます (要素で別のアルゴリズムが指定されている場合でも <CanonicalizationMethod> )。If the output of the last transform algorithm is not defined in bytes (or no transforms were specified), then the canonicalization method is used as an implicit transform (even if a different algorithm was specified in the <CanonicalizationMethod> element).

    • 変換アルゴリズムのの値は、 http://www.w3.org/2000/09/xmldsig#enveloped-signature ドキュメントからの要素の削除として解釈される規則をエンコードし <Signature> ます。A value of http://www.w3.org/2000/09/xmldsig#enveloped-signature for the transform algorithm encodes a rule which is interpreted as remove the <Signature> element from the document. それ以外の場合、エンベロープ署名の検証ツールは、署名を含むドキュメントをダイジェストしますが、署名が適用される前に署名者がドキュメントをダイジェストした後、異なる回答になります。Otherwise, a verifier of an enveloped signature will digest the document, including the signature, but the signer would have digested the document before the signature was applied, leading to different answers.

  • <DigestMethod> 要素The <DigestMethod> element

    要素の属性によって識別される変換されたコンテンツに適用するダイジェスト (暗号化ハッシュ) メソッドを識別し URI <Reference> ます。Identifies the digest (cryptographic hash) method to apply on the transformed content identified by the URI attribute of the <Reference> element. これは、プロパティによって表され Reference.DigestMethod ます。This is represented by the Reference.DigestMethod property.

正規化方法の選択Choosing a canonicalization method

異なる値を使用する必要がある仕様と相互運用する場合を除き、既定の .NET 正規化メソッドを使用することをお勧めします。これは、値がである XML C14N 1.0 アルゴリズムです http://www.w3.org/TR/2001/REC-xml-c14n-20010315Unless interoperating with a specification which requires the use of a different value, we recommend that you use the default .NET canonicalization method, which is the XML-C14N 1.0 algorithm, whose value is http://www.w3.org/TR/2001/REC-xml-c14n-20010315. XMLDSIG のすべての実装で C14N 1.0 アルゴリズムがサポートされている必要があります。特に、適用する暗黙の最終変換であるためです。The XML-C14N 1.0 algorithm is required to be supported by all implementations of XMLDSIG, particularly as it is an implicit final transform to apply.

コメントの保持をサポートする正規化アルゴリズムのバージョンがあります。There are versions of canonicalization algorithms which support preserving comments. コメントを保持する正規化メソッドは、"表示される情報" の原則に違反するため、推奨されません。Comment-preserving canonicalization methods are not recommended because they violate the "sign what is seen" principle. つまり、要素内のコメントは、署名 <Signature> の実行方法の処理ロジックを変更しません。単に署名値がどのようなものになります。That is, the comments in a <Signature> element will not alter the processing logic for how the signature is performed, merely what the signature value is. 弱い署名アルゴリズムと組み合わせると、コメントを含めることにより、攻撃者はハッシュの競合を強制的に実行する必要がなくなり、改ざんされたドキュメントが正当な状態で表示されるようになります。When combined with a weak signature algorithm, allowing the comments to be included gives an attacker unnecessary freedom to force a hash collision, making a tampered document appear legitimate. .NET Framework では、組み込みの canonicalizers のみが既定でサポートされています。In the .NET Framework, only built-in canonicalizers are supported by default. 追加またはカスタムの canonicalizers をサポートするには、プロパティを参照してください SafeCanonicalizationMethodsTo support additional or custom canonicalizers, see the SafeCanonicalizationMethods property. ドキュメントで、プロパティによって表されるコレクションに含まれていない正規化メソッドが使用されている場合、メソッドはを SafeCanonicalizationMethods CheckSignature 返し false ます。If the document uses a canonicalization method that is not in the collection represented by the SafeCanonicalizationMethods property, then the CheckSignature method will return false.

注意

きわめて防御性の高いアプリケーションでは、署名者がコレクションから使用することを想定していない値を削除でき SafeCanonicalizationMethods ます。An extremely defensive application can remove any values it does not expect signers to use from the SafeCanonicalizationMethods collection.

参照値は改ざんから安全ですか。Are the Reference values safe from tampering?

はい、 <Reference> 値は改ざんから安全です。Yes, the <Reference> values are safe from tampering. .NET では、 <SignatureValue> 値とそれに関連付けられている変換のいずれかを処理する前に計算が検証 <Reference> され、悪意のある処理命令を避けるために事前に中止されます。.NET verifies the <SignatureValue> computation before processing any of the <Reference> values and their associated transforms, and will abort early to avoid potentially malicious processing instructions.

署名する要素の選択Choosing the elements to sign

可能であれば、属性には "" の値を使用することをお勧めし URI ます (または、 Uri プロパティを空の文字列に設定します)。We recommend that you use the value of "" for the URI attribute (or set the Uri property to an empty string), if possible. つまり、ドキュメント全体がダイジェスト計算で考慮されるため、ドキュメント全体が改ざんから保護されます。This means the whole document is considered for the digest computation, which means the whole document is protected from tampering.

URI#Foo などのアンカーの形式で値を確認することは、ID 属性が "foo" である要素を参照するのが一般的です。It is very common to see URI values in the form of anchors such as #foo, referring to an element whose ID attribute is "foo". 残念ながら、これはコンテキストではなく target 要素の内容のみを含んでいるため、これが改ざんされることは簡単です。Unfortunately, it is easy for this to be tampered with because this includes only the content of the target element, not the context. 乱用この区別は、XML 署名ラッピング (XSW) と呼ばれています。Abusing this distinction is known as XML Signature Wrapping (XSW).

アプリケーションでコメントがセマンティックと見なされる場合は (XML を扱うときには一般的ではありません)、"#foo" ではなく "#xpointer (id (' foo '))" の代わりに "#xpointer (/)" を使用する必要があります。If your application considers comments to be semantic (which is not common when dealing with XML), then you should use "#xpointer(/)" instead of "", and "#xpointer(id('foo'))" instead of "#foo". #Xpointer のバージョンはコメントを含めて解釈されますが、shortname 形式ではコメントは除外されます。The #xpointer versions are interpreted as including comments, while the shortname forms are excluding comments.

部分的にのみ保護されていて、署名によって保護されているのと同じコンテンツを読み取っていることを確認する必要がある場合は、メソッドを使用し GetIdElement ます。If you need to accept documents which are only partially protected and you want to ensure that you are reading the same content that the signature protected, use the GetIdElement method.

KeyInfo 要素に関するセキュリティ上の考慮事項Security considerations about the KeyInfo element

<KeyInfo> KeyInfo 署名を検証するキーが含まれている省略可能な要素 (プロパティ) のデータは信頼されていない必要があります。The data in the optional <KeyInfo> element (that is, the KeyInfo property), which contains a key to validate the signature, should not be trusted.

特に、値が KeyInfo ベア RSA、DSA、または ECDSA の公開キーを表す場合、 CheckSignature 署名が有効であることを報告するメソッドにもかかわらず、ドキュメントが改ざんされている可能性があります。In particular, when the KeyInfo value represents a bare RSA, DSA or ECDSA public key, the document could have been tampered with, despite the CheckSignature method reporting that the signature is valid. これは、改ざんを行っているエンティティが新しいキーを生成し、その新しいキーを使用して改ざんされたドキュメントに再署名する必要があるために発生する可能性があります。This can happen because the entity doing the tampering just has to generate a new key and re-sign the tampered document with that new key. そのため、アプリケーションが公開キーが予期される値であることを確認しない限り、ドキュメントは改ざんされているかのように処理される必要があります。So, unless your application verifies that the public key is an expected value, the document should be treated as if it were tampered with. これを行うには、アプリケーションがドキュメント内に埋め込まれている公開キーを調べて、ドキュメントコンテキストの既知の値のリストに対して検証する必要があります。This requires that your application examine the public key embedded within the document and verify it against a list of known values for the document context. たとえば、既知のユーザーによって発行されたドキュメントを認識できる場合は、そのユーザーが使用している既知のキーの一覧に対してキーをチェックします。For example, if the document could be understood to be issued by a known user, you'd check the key against a list of known keys used by that user.

メソッドを使用する代わりに、メソッドを使用して、ドキュメントを処理した後にキーを確認することもでき CheckSignatureReturningKey CheckSignature ます。You can also verify the key after processing the document by using the CheckSignatureReturningKey method, instead of using the CheckSignature method. ただし、最適なセキュリティを実現するには、キーを事前に確認する必要があります。But, for the optimal security, you should verify the key beforehand.

または、要素の内容を読み取るのではなく、ユーザーが登録した公開キーを試すことを検討してください <KeyInfo>Alternately, consider trying the user's registered public keys, rather than reading what's in the <KeyInfo> element.

X509Data 要素に関するセキュリティの考慮事項Security considerations about the X509Data element

省略可能 <X509Data> な要素は要素の子であり、 <KeyInfo> x509 証明書の1つ以上の x509 証明書または識別子を含みます。The optional <X509Data> element is a child of the <KeyInfo> element and contains one or more X509 certificates or identifiers for X509 certificates. 要素内のデータは、 <X509Data> 本質的に信頼されていないことも必要です。The data in the <X509Data> element should also not be inherently trusted.

埋め込み要素を使用してドキュメントを検証する場合 <X509Data> 、.net では、そのデータが、ドキュメントの署名を検証するために正常に使用できる X509 証明書に解決されることのみを確認します。When verifying a document with the embedded <X509Data> element, .NET verifies only that the data resolves to an X509 certificate whose public key can be successfully used to validate the document signature. パラメーターをに設定してメソッドを呼び出す場合とは異なり CheckSignature verifySignatureOnly false 、失効確認は実行されません。チェーン信頼はチェックされず、有効期限は検証されません。Unlike calling the CheckSignature method with the verifySignatureOnly parameter set to false, no revocation check is performed, no chain trust is checked, and no expiration is verified. アプリケーションが証明書自体を抽出し、パラメーターをに設定してメソッドに渡す場合でも CheckSignature verifySignatureOnly false 、ドキュメントの改ざんを防ぐために十分な検証は行われません。Even if your application extracts the certificate itself and passes it to the CheckSignature method with the verifySignatureOnly parameter set to false, that is still not sufficient validation to prevent document tampering. 証明書は、署名されているドキュメントに対して適切であることを確認する必要があります。The certificate still needs to be verified as being appropriate for the document being signed.

埋め込み署名証明書を使用すると、 <X509Data> セクション内またはドキュメントコンテンツ内のいずれでも、便利なキーローテーション戦略を提供できます。Using an embedded signing certificate can provide useful key rotation strategies, whether in the <X509Data> section or in the document content. この方法を使用する場合、アプリケーションは証明書を手動で抽出し、次のような検証を実行する必要があります。When using this approach an application should extract the certificate manually and perform validation similar to:

  • 証明書が直接発行されたか、証明機関 (CA) によって公開証明書がアプリケーションに埋め込まれています。The certificate was issued directly or via a chain by a Certificate Authority (CA) whose public certificate is embedded in the application.

    既知のサブジェクト名などの追加のチェックを行わずに OS によって提供される信頼リストを使用しても、の改ざんを防ぐことはできません SignedXmlUsing the OS-provided trust list without additional checks, such as a known subject name, is not sufficient to prevent tampering in SignedXml.

  • ドキュメントの署名時に証明書の有効期限が切れていないことを確認します (または、ほぼリアルタイムのドキュメント処理の場合は "now")。The certificate is verified to have not been expired at the time of document signing (or "now" for near real-time document processing).

  • 失効をサポートする CA によって発行された有効期間が長い証明書の場合、証明書が失効していないことを確認します。For long-lived certificates issued by a CA which supports revocation, verify the certificate was not revoked.

  • 証明書のサブジェクトは、現在のドキュメントに適したものとして検証されます。The certificate subject is verified as being appropriate to the current document.

変換アルゴリズムの選択Choosing the transform algorithm

特定の値 (XrML など) が指定された仕様と相互運用している場合は、仕様に従う必要があります。If you are interoperating with a specification which has dictated specific values (such as XrML), then you need to follow the specification. エンベロープ署名 (ドキュメント全体に署名する場合など) がある場合は、 http://www.w3.org/2000/09/xmldsig#enveloped-signature (クラスによって表される) を使用する必要があり XmlDsigEnvelopedSignatureTransform ます。If you have an enveloped signature (such as when signing the whole document), then you need to use http://www.w3.org/2000/09/xmldsig#enveloped-signature (represented by the XmlDsigEnvelopedSignatureTransform class). 暗黙的な XML C14N 変換も指定できますが、必須ではありません。You can specify the implicit XML-C14N transform as well, but it's not necessary. エンベロープまたはデタッチされたシグネチャの場合、変換は必要ありません。For an enveloping or detached signature, no transforms are required. 暗黙的な XML C14N 変換は、すべてを処理します。The implicit XML-C14N transform takes care of everything.

Microsoft セキュリティ情報 MS16-035によって導入されたセキュリティの更新により、.net では、既定でドキュメントの検証で使用できる変換が制限されています。信頼できない変換では、は CheckSignature 常にを返し false ます。With the security updated introduced by the Microsoft Security Bulletin MS16-035, .NET has restricted what transforms can be used in document verification by default, with untrusted transforms causing CheckSignature to always return false. 特に、(XML で子要素として指定された) 追加の入力を必要とする変換は、悪意のあるユーザーによる不正使用の可能性があるため、許可されなくなりました。In particular, transforms which require additional input (specified as child elements in the XML) are no longer allowed due to their susceptibility of abuse by malicious users. W3C は、これらの制限の影響を受ける2つの主な変換である XPath および XSLT 変換を回避することをアドバイスします。The W3C advises avoiding the XPath and XSLT transforms, which are the two main transforms affected by these restrictions.

外部参照に関する問題The problem with external references

アプリケーションで、外部参照が現在のコンテキストに適していると確認できない場合は、多くのセキュリティの脆弱性 (サービス拒否、分散型リフレクションサービス拒否、情報漏えい、署名バイパス、リモートコード実行など) を実現する方法で不正使用される可能性があります。If an application does not verify that external references seem appropriate for the current context, they can be abused in ways that provide for many security vulnerabilities (including Denial of Service, Distributed Reflection Denial of Service, Information Disclosure, Signature Bypass, and Remote Code Execution). アプリケーションで外部参照 URI を検証する場合でも、リソースが2回読み込まれるという問題が発生する可能性があります。1回はアプリケーションが読み取りを行ったとき、もう1回は SignedXml 読み取り時です。Even if an application were to validate the external reference URI, there would remain a problem of the resource being loaded twice: once when your application reads it, and once when SignedXml reads it. アプリケーションの読み取りとドキュメント検証の手順の内容が同じであることは保証されないため、署名は信頼性を提供しません。Since there's no guarantee that the application read and document verify steps have the same content, the signature does not provide trustworthiness.

外部参照のリスクを考慮して、 SignedXml 外部参照が検出されると、は例外をスローします。Given the risks of external references, SignedXml will throw an exception when an external reference is encountered. この問題の詳細については、 サポート技術情報の記事 3148821を参照してください。For more information about this issue, see KB article 3148821.

コンストラクター

SignedXml()

SignedXml クラスの新しいインスタンスを初期化します。Initializes a new instance of the SignedXml class.

SignedXml(XmlDocument)

指定した XML ドキュメントから SignedXml クラスの新しいインスタンスを初期化します。Initializes a new instance of the SignedXml class from the specified XML document.

SignedXml(XmlElement)

指定した SignedXml オブジェクトから XmlElement クラスの新しいインスタンスを初期化します。Initializes a new instance of the SignedXml class from the specified XmlElement object.

フィールド

m_signature

現在の Signature オブジェクトの SignedXml オブジェクトを表します。Represents the Signature object of the current SignedXml object.

m_strSigningKeyName

SignedXml オブジェクトに署名するための、インストールされているキーの名前を表します。Represents the name of the installed key to be used for signing the SignedXml object.

XmlDecryptionTransformUrl

XML モード復号化変換の URI (Uniform Resource Identifier) を表します。Represents the Uniform Resource Identifier (URI) for the XML mode decryption transformation. このフィールドは定数です。This field is constant.

XmlDsigBase64TransformUrl

base 64 変換の URI (Uniform Resource Identifier) を表します。Represents the Uniform Resource Identifier (URI) for the base 64 transformation. このフィールドは定数です。This field is constant.

XmlDsigC14NTransformUrl

Canonical XML 変換の URI (Uniform Resource Identifier) を表します。Represents the Uniform Resource Identifier (URI) for the Canonical XML transformation. このフィールドは定数です。This field is constant.

XmlDsigC14NWithCommentsTransformUrl

Canonical XML 変換の URI (Uniform Resource Identifier) をコメント付きで表します。Represents the Uniform Resource Identifier (URI) for the Canonical XML transformation, with comments. このフィールドは定数です。This field is constant.

XmlDsigCanonicalizationUrl

XML デジタル署名のための標準の標準化アルゴリズムの URI (Uniform Resource Identifier) を表します。Represents the Uniform Resource Identifier (URI) for the standard canonicalization algorithm for XML digital signatures. このフィールドは定数です。This field is constant.

XmlDsigCanonicalizationWithCommentsUrl

XML デジタル署名のための標準の標準化アルゴリズムの URI (Uniform Resource Identifier) を表し、コメントを格納します。Represents the Uniform Resource Identifier (URI) for the standard canonicalization algorithm for XML digital signatures and includes comments. このフィールドは定数です。This field is constant.

XmlDsigDSAUrl

XML デジタル署名のための標準の DSA アルゴリズムの URI (Uniform Resource Identifier) を表します。Represents the Uniform Resource Identifier (URI) for the standard DSA algorithm for XML digital signatures. このフィールドは定数です。This field is constant.

XmlDsigEnvelopedSignatureTransformUrl

エンベロープ シグネチャ変換の URI (Uniform Resource Identifier) を表します。Represents the Uniform Resource Identifier (URI) for enveloped signature transformation. このフィールドは定数です。This field is constant.

XmlDsigExcC14NTransformUrl

排他的 XML 標準化の URI (Uniform Resource Identifier) を表します。Represents the Uniform Resource Identifier (URI) for exclusive XML canonicalization. このフィールドは定数です。This field is constant.

XmlDsigExcC14NWithCommentsTransformUrl

排他的 XML 標準化の URI (Uniform Resource Identifier) をコメント付きで表します。Represents the Uniform Resource Identifier (URI) for exclusive XML canonicalization, with comments. このフィールドは定数です。This field is constant.

XmlDsigHMACSHA1Url

XML デジタル署名のための標準の HMACSHA1 アルゴリズムの URI (Uniform Resource Identifier) を表します。Represents the Uniform Resource Identifier (URI) for the standard HMACSHA1 algorithm for XML digital signatures. このフィールドは定数です。This field is constant.

XmlDsigMinimalCanonicalizationUrl

XML デジタル署名のための標準の最小標準化アルゴリズムの URI (Uniform Resource Identifier) を表します。Represents the Uniform Resource Identifier (URI) for the standard minimal canonicalization algorithm for XML digital signatures. このフィールドは定数です。This field is constant.

XmlDsigNamespaceUrl

XML デジタル署名のための標準名前空間の URI (Uniform Resource Identifier) を表します。Represents the Uniform Resource Identifier (URI) for the standard namespace for XML digital signatures. このフィールドは定数です。This field is constant.

XmlDsigRSASHA1Url

XML デジタル署名のための標準の RSA 署名メソッドの URI (Uniform Resource Identifier) を表します。Represents the Uniform Resource Identifier (URI) for the standard RSA signature method for XML digital signatures. このフィールドは定数です。This field is constant.

XmlDsigRSASHA256Url

XML デジタル署名の RSA SHA-256 署名メソッドのバリエーションの Uniform Resource Identifier (URI) を表します。Represents the Uniform Resource Identifier (URI) for the RSA SHA-256 signature method variation for XML digital signatures. このフィールドは定数です。This field is constant.

XmlDsigRSASHA384Url

XML デジタル署名の RSA SHA-384 署名メソッドのバリエーションの Uniform Resource Identifier (URI) を表します。Represents the Uniform Resource Identifier (URI) for the RSA SHA-384 signature method variation for XML digital signatures. このフィールドは定数です。This field is constant.

XmlDsigRSASHA512Url

XML デジタル署名の RSA SHA-512 署名メソッドのバリエーションの Uniform Resource Identifier (URI) を表します。Represents the Uniform Resource Identifier (URI) for the RSA SHA-512 signature method variation for XML digital signatures. このフィールドは定数です。This field is constant.

XmlDsigSHA1Url

XML デジタル署名のスタンダード SHA1 ダイジェスト メソッドの Uniform Resource Identifier (URI) を表します。Represents the Uniform Resource Identifier (URI) for the standard SHA1 digest method for XML digital signatures. このフィールドは定数です。This field is constant.

XmlDsigSHA256Url

XML デジタル署名のスタンダード SHA256 ダイジェスト メソッドの Uniform Resource Identifier (URI) を表します。Represents the Uniform Resource Identifier (URI) for the standard SHA256 digest method for XML digital signatures. このフィールドは定数です。This field is constant.

XmlDsigSHA384Url

XML デジタル署名のスタンダード SHA384 ダイジェスト メソッドの Uniform Resource Identifier (URI) を表します。Represents the Uniform Resource Identifier (URI) for the standard SHA384 digest method for XML digital signatures. このフィールドは定数です。This field is constant.

XmlDsigSHA512Url

XML デジタル署名のスタンダード SHA512 ダイジェスト メソッドの Uniform Resource Identifier (URI) を表します。Represents the Uniform Resource Identifier (URI) for the standard SHA512 digest method for XML digital signatures. このフィールドは定数です。This field is constant.

XmlDsigXPathTransformUrl

XML Path Language (XPath) の URI (Uniform Resource Identifier) を表します。Represents the Uniform Resource Identifier (URI) for the XML Path Language (XPath). このフィールドは定数です。This field is constant.

XmlDsigXsltTransformUrl

XSLT 変換の URI (Uniform Resource Identifier) を表します。Represents the Uniform Resource Identifier (URI) for XSLT transformations. このフィールドは定数です。This field is constant.

XmlLicenseTransformUrl

署名の XrML ライセンスを正規化するために使用されるライセンス変換アルゴリズムの URI (Uniform Resource Identifier) を表します。Represents the Uniform Resource Identifier (URI) for the license transform algorithm used to normalize XrML licenses for signatures.

プロパティ

EncryptedXml

XML 暗号化処理規則を定義する EncryptedXml オブジェクトを取得または設定します。Gets or sets an EncryptedXml object that defines the XML encryption processing rules.

KeyInfo

現在の KeyInfo オブジェクトの SignedXml オブジェクトを取得または設定します。Gets or sets the KeyInfo object of the current SignedXml object.

Resolver

現在の XmlResolver オブジェクトを設定します。Sets the current XmlResolver object.

SafeCanonicalizationMethods

正規化アルゴリズムが明示的に許可されているメソッドの名前を取得します。Gets the names of methods whose canonicalization algorithms are explicitly allowed.

Signature

現在の Signature オブジェクトの SignedXml オブジェクトを取得します。Gets the Signature object of the current SignedXml object.

SignatureFormatValidator

XML 署名の (暗号によるセキュリティではなく) 書式を検証するために呼び出されるデリゲートを取得します。Gets a delegate that will be called to validate the format (not the cryptographic security) of an XML signature.

SignatureLength

現在の SignedXml オブジェクトの署名の長さを取得します。Gets the length of the signature for the current SignedXml object.

SignatureMethod

現在の SignedXml オブジェクトの署名メソッドを取得します。Gets the signature method of the current SignedXml object.

SignatureValue

現在の SignedXml オブジェクトの署名値を取得します。Gets the signature value of the current SignedXml object.

SignedInfo

現在の SignedInfo オブジェクトの SignedXml オブジェクトを取得します。Gets the SignedInfo object of the current SignedXml object.

SigningKey

SignedXml オブジェクトに署名するために使用する非対称アルゴリズム キーを取得または設定します。Gets or sets the asymmetric algorithm key used for signing a SignedXml object.

SigningKeyName

SignedXml オブジェクトに署名するための、インストールされているキーの名前を取得または設定します。Gets or sets the name of the installed key to be used for signing the SignedXml object.

メソッド

AddObject(DataObject)

署名されるオブジェクトのリストに DataObject オブジェクトを追加します。Adds a DataObject object to the list of objects to be signed.

AddReference(Reference)

Reference オブジェクトを、XML デジタル署名の作成に使用するダイジェスト メソッド、ダイジェスト値、および変換を記述する SignedXml オブジェクトに追加します。Adds a Reference object to the SignedXml object that describes a digest method, digest value, and transform to use for creating an XML digital signature.

CheckSignature()

Signature プロパティが署名内の公開キーを使用して検証するかどうかを判断します。Determines whether the Signature property verifies using the public key in the signature.

CheckSignature(AsymmetricAlgorithm)

Signature プロパティが指定したキーに対して検証するかどうかを判断します。Determines whether the Signature property verifies for the specified key.

CheckSignature(KeyedHashAlgorithm)

Signature プロパティが指定のメッセージ認証コード (MAC: message authentication code) アルゴリズムに対して検証するかどうかを判断します。Determines whether the Signature property verifies for the specified message authentication code (MAC) algorithm.

CheckSignature(X509Certificate2, Boolean)

Signature プロパティが指定した X509Certificate2 オブジェクトに対して検証するかどうか、およびオプションで証明書が有効かどうかを判断します。Determines whether the Signature property verifies for the specified X509Certificate2 object and, optionally, whether the certificate is valid.

CheckSignatureReturningKey(AsymmetricAlgorithm)

Signature プロパティが署名内の公開キーを使用して検証するかどうかを判断します。Determines whether the Signature property verifies using the public key in the signature.

ComputeSignature()

XML デジタル署名を計算します。Computes an XML digital signature.

ComputeSignature(KeyedHashAlgorithm)

指定したメッセージ認証コード (MAC: message authentication code) アルゴリズムを使用して XML デジタル署名を計算します。Computes an XML digital signature using the specified message authentication code (MAC) algorithm.

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。Determines whether the specified object is equal to the current object.

(継承元 Object)
GetHashCode()

既定のハッシュ関数として機能します。Serves as the default hash function.

(継承元 Object)
GetIdElement(XmlDocument, String)

指定した XmlElement オブジェクトから、指定した ID の XmlDocument オブジェクトを返します。Returns the XmlElement object with the specified ID from the specified XmlDocument object.

GetPublicKey()

署名の公開キーを返します。Returns the public key of a signature.

GetType()

現在のインスタンスの Type を取得します。Gets the Type of the current instance.

(継承元 Object)
GetXml()

SignedXml オブジェクトの XML 表現を返します。Returns the XML representation of a SignedXml object.

LoadXml(XmlElement)

XML 要素から SignedXml の状態を読み込みます。Loads a SignedXml state from an XML element.

MemberwiseClone()

現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object.

(継承元 Object)
ToString()

現在のオブジェクトを表す文字列を返します。Returns a string that represents the current object.

(継承元 Object)

適用対象