SignedXml SignedXml SignedXml SignedXml Class

Définition

Fournit un wrapper sur un objet de signature XML principal afin de faciliter la création de signatures 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
Héritage
SignedXmlSignedXmlSignedXmlSignedXml

Exemples

L’exemple de code suivant montre comment signer et vérifier un document XML entier à l’aide d’une signature enveloppée.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.
      RSACryptoServiceProvider^ Key = gcnew RSACryptoServiceProvider;
      
      // 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.
           RSACryptoServiceProvider Key = new RSACryptoServiceProvider();

           // 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 asymetric 
    // 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
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 New RSACryptoServiceProvider()
         
         ' 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 asymetric 
   ' 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 

L’exemple de code suivant montre comment signer et vérifier un élément unique d’un document XML à l’aide d’une signature enveloppante.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.
   RSACryptoServiceProvider^ Key = gcnew RSACryptoServiceProvider;
   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 
      // RSACryptoServiceProvider.
      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.
       RSACryptoServiceProvider Key = new RSACryptoServiceProvider();

       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 
           // RSACryptoServiceProvider.
           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
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 New RSACryptoServiceProvider()

        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 
            ' RSACryptoServiceProvider.
            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

Remarques

Le SignedXml classe est l’implémentation de .NET Framework du World Wide Web Consortium (W3C) XML Signature Syntax and spécification du traitement, également appelé XMLDSIG (Signature numérique XML).The SignedXml class is the .NET Framework implementation of the World Wide Web Consortium (W3C) XML Signature Syntax and Processing Specification, also known as XMLDSIG (XML Digital Signature). XMLDSIG est un moyen interopérable, basée sur des normes pour signer et vérifier tout ou partie d’un document XML ou d’autres données adressables à partir d’un identificateur URI (Uniform Resource).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).

Utilisez la SignedXml classe chaque fois que vous avez besoin partager des données XML signées entre applications ou organisations de manière standard.Use the SignedXml class whenever you need to share signed XML data between applications or organizations in a standard way. Toutes les données signées à l’aide de cette classe peuvent être vérifiées par une implémentation conforme de la spécification W3C pour XMLDSIG.Any data signed using this class can be verified by any conforming implementation of the W3C specification for XMLDSIG.

Le SignedXml classe vous permet de créer les trois types de signatures numériques XML suivants :The SignedXml class allows you to create the following three kinds of XML digital signatures:

Type de signatureSignature Type DescriptionDescription
Signature enveloppéeEnveloped signature La signature est contenue dans l’élément XML en cours de signature.The signature is contained within the XML element being signed.
Signature enveloppanteEnveloping signature Le XML signé est contenu dans le <Signature> élément.The signed XML is contained within the <Signature> element.
Signature détachée interneInternal detached signature La signature et le XML signé se trouvent dans le même document, mais aucun élément ne contient l’autre.The signature and signed XML are in the same document, but neither element contains the other.

Il existe également un quatrième type de signature appelé une signature détachée externe lorsque les données et la signature sont dans des documents XML distincts.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. Signatures détachées externes ne sont pas pris en charge par le SignedXml classe.External detached signatures are not supported by the SignedXml class.

La structure d’une Signature XMLThe structure of an XML Signature

XMLDSIG crée un <Signature> élément, qui contient une signature numérique d’un document XML ou d’autres données adressables à partir d’un URI.XMLDSIG creates a <Signature> element, which contains a digital signature of an XML document or other data that is addressable from a URI. Le <Signature> élément peut éventuellement contenir des informations sur l’emplacement où rechercher une clé qui vérifiera la signature et de l’algorithme de chiffrement qui a été utilisé pour la 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. La structure de base est la suivante :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>  

Les parties principales de cette structure sont :The main parts of this structure are:

Le <CanonicalizationMethod> élémentThe <CanonicalizationMethod> element
Spécifie les règles de réécriture du Signature élément à partir de texte/XML, en octets pour la validation de signature.Specifies the rules for rewriting the Signature element from XML/text into bytes for signature validation. La valeur par défaut dans le .NET Framework est https://www.w3.org/TR/2001/REC-xml-c14n-20010315, qui identifie un algorithme digne de confiance.The default value in the .NET Framework is https://www.w3.org/TR/2001/REC-xml-c14n-20010315, which identifies a trustworthy algorithm. Cet élément est représenté par le SignedInfo.CanonicalizationMethod propriété.This element is represented by the SignedInfo.CanonicalizationMethod property.

Le <SignatureMethod> élémentThe <SignatureMethod> element
Spécifie l’algorithme utilisé pour la génération de signature et de validation, qui a été appliquée à la <Signature> élément pour produire la valeur de <SignatureValue>.Specifies the algorithm used for signature generation and validation, which was applied to the <Signature> element to produce the value in <SignatureValue>. Dans l’exemple ci-dessus, la valeur http://www.w3.org/2000/09/xmldsig#rsa-sha1 identifie une signature RSA PKCS1 SHA-1.In the example above, the value http://www.w3.org/2000/09/xmldsig#rsa-sha1 identifies an RSA PKCS1 SHA-1 signature. Cet élément est représenté par le SignatureMethod propriété.This element is represented by the SignatureMethod property.

Le <SignatureValue> élémentThe <SignatureValue> element
Spécifie la signature de chiffrement pour le <Signature> élément.Specifies the cryptographic signature for the <Signature> element. Si cette signature ne vérifie pas, puis une partie de la <Signature> bloc a été falsifié, et le document est considéré comme non valide.If this signature does not verify, then some portion of the <Signature> block was tampered with, and the document is considered invalid. Tant que le <CanonicalizationMethod> valeur est digne de confiance, cette valeur est très résistante aux falsifications.As long as the <CanonicalizationMethod> value is trustworthy, this value is highly resistant to tampering. Cet élément est représenté par le SignatureValue propriété.This element is represented by the SignatureValue property.

Le URI attribut de la <Reference> élémentThe URI attribute of the <Reference> element
Spécifie un objet de données à l’aide d’une référence URI.Specifies a data object using a URI reference. Cet attribut est représenté par le Reference.Uri propriété.This attribute is represented by the Reference.Uri property.

  • Ne pas spécifier le URI attribut, autrement dit, le Reference.Uri propriété null, signifie que l’application réceptrice est censée connaître l’identité de l’objet.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. Dans la plupart des cas, un null URI entraîne une exception est levée.In most cases, a null URI will result in an exception being thrown. N’utilisez pas un null URI, sauf si votre application interagit avec un protocole qui la requiert.Do not use a null URI, unless your application is interoperating with a protocol which requires it.

  • Définition de la URI attribut à une chaîne vide indique que l’élément racine du document est en cours de signature, un formulaire de signature enveloppée.Setting the URI attribute to an empty string indicates that the root element of the document is being signed, a form of enveloped signature.

  • Si la valeur de URI attribut commence par #, puis la valeur doit être résolue en un élément dans le document actif.If the value of URI attribute starts with #, then the value must resolve to an element in the current document. Ce formulaire peut être utilisé avec les types pris en charge de signature (signature enveloppée, enveloppement de signature ou signature détachée interne).This form can be used with any of the supported signature types (enveloped signature, enveloping signature or internal detached signature).

  • Tout autre élément est considéré comme une signature détachées des ressources externes et n’est pas pris en charge par le SignedXml classe.Anything else is considered an external resource detached signature and is not supported by the SignedXml class.

Le <Transforms> élémentThe <Transforms> element
Contient une liste ordonnée de <Transform> éléments qui décrivent la façon dont le signataire obtenu l’objet de données qui a été compris.Contains an ordered list of <Transform> elements that describe how the signer obtained the data object that was digested. Un algorithme de transformation est similaire à la méthode de canonisation, mais au lieu de réécrire le <Signature> élément, il réécrit le contenu identifié par le URI attribut de la <Reference> élément.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. Le <Transforms> élément est représenté par la TransformChain classe.The <Transforms> element is represented by the TransformChain class.

  • Chaque algorithme de transformation est définie comme prenant XML (élément node-set XPath) ou octets en entrée.Each transform algorithm is defined as taking either XML (an XPath node-set) or bytes as input. Si le format des données actuelles est différente de la configuration requise d’entrée de transformation, les règles de conversion sont appliquées.If the format of the current data differs from the transform input requirements, conversion rules are applied.

  • Chaque algorithme de transformation est défini comme générant XML ou octets comme sortie.Each transform algorithm is defined as producing either XML or bytes as the output.

  • Si la sortie de l’algorithme de transformation dernière n’est pas définie en octets (ou aucune transformation n’a été spécifiée), puis le méthode de canonisation est utilisé comme une transformation implicite (même si un algorithme différent a été spécifié dans le <CanonicalizationMethod> élément).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).

  • La valeur http://www.w3.org/2000/09/xmldsig#enveloped-signature pour la transformation algorithme encode une règle qui est interprétée comme supprimer la <Signature> élément à partir du document.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. Sinon, un vérificateur d’une signature enveloppée sera digest du document, y compris la signature, mais le signataire serait ont compris le document avant que la signature a été appliquée, ce qui conduit à des réponses différentes.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.

Le <DigestMethod> élémentThe <DigestMethod> element
Identifie la méthode digest (hachage de chiffrement) à appliquer sur le contenu transformé identifié par le URI attribut de la <Reference> élément.Identifies the digest (cryptographic hash) method to apply on the transformed content identified by the URI attribute of the <Reference> element. Ceci est représenté par le Reference.DigestMethod propriété.This is represented by the Reference.DigestMethod property.

Choix d’une méthode de canonisationChoosing a canonicalization method

À moins que l’interopérabilité avec une spécification qui requiert l’utilisation d’une valeur différente, nous vous recommandons d’utiliser la méthode de canonisation par défaut dans le .NET Framework qui est l’algorithme C14N de XML 1.0, dont la valeur est https://www.w3.org/TR/2001/REC-xml-c14n-20010315.Unless interoperating with a specification which requires the use of a different value, we recommend that you use the default canonicalization method in the .NET Framework which is the XML-C14N 1.0 algorithm, whose value is https://www.w3.org/TR/2001/REC-xml-c14n-20010315. L’algorithme de XML-C14N 1.0 doit être pris en charge par toutes les implémentations de XMLDSIG, surtout parce qu’il est une transformation finale implicite à appliquer.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.

Il existe des versions d’algorithmes de canonisation qui prennent en charge la conservation des commentaires.There are versions of canonicalization algorithms which support preserving comments. Méthodes de canonisation en conservant le commentaire ne sont pas recommandés, car ils violent le principe de « signer celle ».Comment-preserving canonicalization methods are not recommended because they violate the "sign what is seen" principle. Autrement dit, les commentaires dans un <Signature> élément ne modifiera en rien la logique de traitement pour le mode d’exécution de la signature, est simplement quelle la valeur de 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. Lorsqu’il est combiné avec un algorithme de signature faible, ce qui permet des commentaires pour être inclus donne une attaquant inutiles de liberté forcer une collision de hachage, rendre un document falsifié apparaissent légitime.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. Dans le .NET Framework, uniquement les canonicalizers intégrés sont pris en charge par défaut.In the .NET Framework, only built-in canonicalizers are supported by default. Pour prendre en charge canonicalizers supplémentaires ou personnalisés, consultez le SafeCanonicalizationMethods propriété.To support additional or custom canonicalizers, see the SafeCanonicalizationMethods property. Si le document utilise une méthode de canonisation qui n’est pas dans la collection représentée par le SafeCanonicalizationMethods propriété, puis le CheckSignature méthode retournera 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.

Notes

Une application extrêmement défensive peut supprimer toutes les valeurs qu’il n’attend pas signataires à utiliser à partir de la SafeCanonicalizationMethods collection.An extremely defensive application can remove any values it does not expect signers to use from the SafeCanonicalizationMethods collection.

Les valeurs de référence sont sécurisés contre la falsification ?Are the Reference values safe from tampering?

Oui, le <Reference> valeurs sont sécurisés contre la falsification.Yes, the <Reference> values are safe from tampering. Le .NET framework vérifie le <SignatureValue> calcul avant de traiter l’un d'entre le <Reference> valeurs leur sont associées transforme et abandonnera tôt pour éviter les instructions de traitement potentiellement malveillants.The .NET framework 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.

Choisir les éléments à signerChoosing the elements to sign

Nous vous recommandons d’utiliser la valeur de « » pour le URI attribut (ou définir le Uri propriété à une chaîne vide), si possible.We recommend that you use the value of "" for the URI attribute (or set the Uri property to an empty string), if possible. Cela signifie que le document entier est considéré comme pour le calcul digest, ce qui signifie que l’ensemble du document est protégé contre la falsification.This means the whole document is considered for the digest computation, which means the whole document is protected from tampering.

Il est très courant de voir URI valeurs sous la forme d’ancres telles que #foo, qui fait référence à un élément dont l’attribut ID est « 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". Malheureusement, il est facile pour cela être falsifiés, car cela inclut uniquement le contenu de l’élément cible, pas le contexte.Unfortunately, it is easy for this to be tampered with because this includes only the content of the target element, not the context. Utilisation abusive cette distinction est connu comme le Wrapping de Signature XML (XSW).Abusing this distinction is known as XML Signature Wrapping (XSW).

Si votre application prend en compte la sémantique de commentaires (ce qui est peu courant quand affaire XML), vous devez utiliser « #xpointer(/) » au lieu de « » et « #xpointer(id('foo')) » au lieu de « #foo ».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". Les versions #xpointer sont interprétées comme incluant des commentaires, tandis que les formulaires shortname sont à l’exclusion des commentaires.The #xpointer versions are interpreted as including comments, while the shortname forms are excluding comments.

Si vous devez accepter les documents protégés que partiellement et que vous souhaitez vous assurer que vous lisez le même contenu protégé de la signature, utilisez la GetIdElement (méthode).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.

Considérations sur la sécurité sur l’élément KeyInfoSecurity considerations about the KeyInfo element

Les données dans le paramètre facultatif <KeyInfo> élément (autrement dit, le KeyInfo propriété), qui contient une clé pour valider la signature, ne doit pas être approuvé.The data in the optional <KeyInfo> element (that is, the KeyInfo property), which contains a key to validate the signature, should not be trusted.

En particulier, quand le KeyInfo valeur représente une clé publique RSA, DSA ou ECDSA strict, le document peut avoir été falsifié, malgré la CheckSignature méthode reporting que la signature est valide.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. Cela peut se produire, car l’entité effectuant la falsification simplement doit générer une nouvelle clé et signer à nouveau le document falsifié avec cette nouvelle clé.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. Par conséquent, à moins que votre application vérifie que la clé publique est une valeur attendue, le document doit être traité comme si elles ont été falsifiées.So, unless your application verifies that the public key is an expected value, the document should be treated as if it were tampered with. Cela nécessite que votre application examiner la clé publique est incorporée dans le document et la vérifier par rapport à une liste de valeurs connues pour le contexte de document.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. Par exemple, si le document peut être compris doit être émis par un utilisateur connu, vous devez vérifier la clé par rapport à une liste des clés connues utilisées par cet utilisateur.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.

Vous pouvez également vérifier la clé après avoir traité le document à l’aide de la CheckSignatureReturningKey méthode, au lieu d’utiliser le CheckSignature (méthode).You can also verify the key after processing the document by using the CheckSignatureReturningKey method, instead of using the CheckSignature method. Toutefois, pour une sécurité optimale, vous devez vérifier la clé au préalable.But, for the optimal security, you should verify the key beforehand.

Vous pouvez également prendre en compte la tentative de l’utilisateur inscrit des clés publiques, au lieu de lire Nouveautés dans le <KeyInfo> élément.Alternately, consider trying the user's registered public keys, rather than reading what's in the <KeyInfo> element.

Considérations sur la sécurité sur l’élément X509DataSecurity considerations about the X509Data element

Le paramètre facultatif <X509Data> élément est un enfant de la <KeyInfo> élément et contient un ou plusieurs X509 certificats ou des identificateurs pour X509 certificats.The optional <X509Data> element is a child of the <KeyInfo> element and contains one or more X509 certificates or identifiers for X509 certificates. Les données dans le <X509Data> élément doit également être pas approuvée par nature.The data in the <X509Data> element should also not be inherently trusted.

Lors de la vérification d’un document avec l’embedded <X509Data> élément, le .NET Framework vérifie uniquement que les données se résout en un X509 certificat dont la clé publique peut être utilisée avec succès pour valider la signature de document.When verifying a document with the embedded <X509Data> element, the .NET Framework verifies only that the data resolves to an X509 certificate whose public key can be successfully used to validate the document signature. Contrairement à appeler le CheckSignature méthode avec le verifySignatureOnly paramètre défini sur false, aucune vérification de révocation est effectuée, aucune chaîne d’approbation n’est vérifiée, et sans date d’expiration est vérifié.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. Même si votre application extrait le certificat lui-même et le transmet à la CheckSignature méthode avec le verifySignatureOnly paramètre la valeur false, qui est toujours une validation pas suffisante pour empêcher toute falsification de document.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. Le certificat doit toujours être vérifié comme étant appropriée pour le document en cours de signature.The certificate still needs to be verified as being appropriate for the document being signed.

À l’aide d’un certificat de signature incorporé peut fournir des stratégies de rotation des clés utile, si dans le <X509Data> section ou dans le contenu du document.Using an embedded signing certificate can provide useful key rotation strategies, whether in the <X509Data> section or in the document content. Lorsque vous utilisez cette approche une application doit extraire le certificat manuellement et effectuer une validation similaire à :When using this approach an application should extract the certificate manually and perform validation similar to:

  • Le certificat a été émis directement ou via une chaîne par une autorité de certificat (CA) dont le certificat public est incorporé dans l’application.The certificate was issued directly or via a chain by a Certificate Authority (CA) whose public certificate is embedded in the application.

    À l’aide de la liste de confiance fournie par le système d’exploitation sans les vérifications supplémentaires, par exemple un nom d’objet connu, n’est pas suffisant pour empêcher toute falsification dans SignedXml.Using the OS-provided trust list without additional checks, such as a known subject name, is not sufficient to prevent tampering in SignedXml.

  • Le certificat est vérifié n’a ne pas été expiré au moment de la signature de documents (ou « maintenant » pour près de traitement des documents en temps réel).The certificate is verified to have not been expired at the time of document signing (or "now" for near real-time document processing).

  • Pour les certificats émis par une autorité de certification qui prend en charge de la révocation de longue durées, vérifiez que le certificat n’a pas révoqué.For long-lived certificates issued by a CA which supports revocation, verify the certificate was not revoked.

  • L’objet du certificat est vérifiée comme étant appropriée au document actif.The certificate subject is verified as being appropriate to the current document.

Choix de l’algorithme de transformationChoosing the transform algorithm

Si vous interagissez avec une spécification qui a défini des valeurs spécifiques (par exemple, XrML), vous devez suivre la spécification.If you are interoperating with a specification which has dictated specific values (such as XrML), then you need to follow the specification. Si vous disposez d’une signature enveloppée (par exemple lorsque l’ensemble du document de signature), vous devrez utiliser http://www.w3.org/2000/09/xmldsig#enveloped-signature (représenté par la XmlDsigEnvelopedSignatureTransform classe).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). Vous pouvez spécifier la transformation de XML-C14N implicite, mais il n’est pas nécessaire.You can specify the implicit XML-C14N transform as well, but it's not necessary. Pour une signature enveloppante ou détachée, aucune transformation n’est nécessaire.For an enveloping or detached signature, no transforms are required. La transformation de XML-C14N implicite prend tout en charge.The implicit XML-C14N transform takes care of everything.

Avec la mise à jour de sécurité introduits par le Bulletin de sécurité Microsoft MS16-035, le .NET Framework a limité les transformations peuvent être utilisées dans la vérification de document par défaut, avec des transformations non approuvées à l’origine de CheckSignaturepour toujours retourner false.With the security updated introduced by the Microsoft Security Bulletin MS16-035, the .NET Framework has restricted what transforms can be used in document verification by default, with untrusted transforms causing CheckSignature to always return false. En particulier, les transformations qui nécessitent une entrée supplémentaire (spécifiée en tant qu’éléments enfants dans le code XML) ne sont plus autorisées en raison de leur sensibilité des abus par des utilisateurs malveillants.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. Le W3C recommande en évitant les transformations XSLT et XPath, qui sont les deux transformations principales affectées par ces limitations.The W3C advises avoiding the XPath and XSLT transforms, which are the two main transforms affected by these restrictions.

Le problème avec les références externesThe problem with external references

Si une application ne vérifie pas que les références externes semblent appropriées pour le contexte actuel, ils peuvent être utilisées de manière à fournir de nombreuses failles de sécurité (y compris les informations de déni de Service, réflexion déni de Service distribué, La divulgation contournement de la Signature et l’exécution de Code à distance).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). Même si une application pour valider l’URI de référence externe, il resterait un problème de la ressource en cours de chargement à deux reprises : une fois lorsque votre application lit et une fois lorsque SignedXml le lit.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. Dans la mesure où il n’existe aucune garantie que la lecture de l’application et le document vérifient étapes ont le même contenu, la signature ne fournit pas de fiabilité.Since there's no guarantee that the application read and document verify steps have the same content, the signature does not provide trustworthiness.

Étant donné les risques de références externes, SignedXml lève une exception lorsqu’une référence externe est rencontrée.Given the risks of external references, SignedXml will throw an exception when an external reference is encountered. Pour plus d’informations sur ce problème, consultez article de la base de connaissances 3148821.For more information about this issue, see KB article 3148821.

Constructeurs

SignedXml() SignedXml() SignedXml() SignedXml()

Initialise une nouvelle instance de la classe SignedXml.Initializes a new instance of the SignedXml class.

SignedXml(XmlDocument) SignedXml(XmlDocument) SignedXml(XmlDocument) SignedXml(XmlDocument)

Initialise une nouvelle instance de la classe SignedXml à partir du document XML spécifié.Initializes a new instance of the SignedXml class from the specified XML document.

SignedXml(XmlElement) SignedXml(XmlElement) SignedXml(XmlElement) SignedXml(XmlElement)

Initialise une nouvelle instance de la classe SignedXml à partir de l'objet XmlElement spécifié.Initializes a new instance of the SignedXml class from the specified XmlElement object.

Champs

m_signature m_signature m_signature m_signature

Représente l'objet Signature de l'objet SignedXml en cours.Represents the Signature object of the current SignedXml object.

m_strSigningKeyName m_strSigningKeyName m_strSigningKeyName m_strSigningKeyName

Représente le nom de la clé installée à utiliser pour signer l'objet SignedXml.Represents the name of the installed key to be used for signing the SignedXml object.

XmlDecryptionTransformUrl XmlDecryptionTransformUrl XmlDecryptionTransformUrl XmlDecryptionTransformUrl

Représente l'URI de la transformation du déchiffrement du mode XML.Represents the Uniform Resource Identifier (URI) for the XML mode decryption transformation. Ce champ est constant.This field is constant.

XmlDsigBase64TransformUrl XmlDsigBase64TransformUrl XmlDsigBase64TransformUrl XmlDsigBase64TransformUrl

Représente l'URI de la transformation en base 64.Represents the Uniform Resource Identifier (URI) for the base 64 transformation. Ce champ est constant.This field is constant.

XmlDsigC14NTransformUrl XmlDsigC14NTransformUrl XmlDsigC14NTransformUrl XmlDsigC14NTransformUrl

Représente l'URI de la transformation XML canonique.Represents the Uniform Resource Identifier (URI) for the Canonical XML transformation. Ce champ est constant.This field is constant.

XmlDsigC14NWithCommentsTransformUrl XmlDsigC14NWithCommentsTransformUrl XmlDsigC14NWithCommentsTransformUrl XmlDsigC14NWithCommentsTransformUrl

Représente l'URI de la transformation XML canonique, avec des commentairesRepresents the Uniform Resource Identifier (URI) for the Canonical XML transformation, with comments. Ce champ est constant.This field is constant.

XmlDsigCanonicalizationUrl XmlDsigCanonicalizationUrl XmlDsigCanonicalizationUrl XmlDsigCanonicalizationUrl

Représente l'URI de l'algorithme de canonisation standard pour les signatures numériques XML.Represents the Uniform Resource Identifier (URI) for the standard canonicalization algorithm for XML digital signatures. Ce champ est constant.This field is constant.

XmlDsigCanonicalizationWithCommentsUrl XmlDsigCanonicalizationWithCommentsUrl XmlDsigCanonicalizationWithCommentsUrl XmlDsigCanonicalizationWithCommentsUrl

Représente l'URI de l'algorithme de canonisation standard pour les signatures numériques XML. Il inclut des commentaires.Represents the Uniform Resource Identifier (URI) for the standard canonicalization algorithm for XML digital signatures and includes comments. Ce champ est constant.This field is constant.

XmlDsigDSAUrl XmlDsigDSAUrl XmlDsigDSAUrl XmlDsigDSAUrl

Représente l'URI de l'algorithme DSA standard pour les signatures numériques XML.Represents the Uniform Resource Identifier (URI) for the standard DSA algorithm for XML digital signatures. Ce champ est constant.This field is constant.

XmlDsigEnvelopedSignatureTransformUrl XmlDsigEnvelopedSignatureTransformUrl XmlDsigEnvelopedSignatureTransformUrl XmlDsigEnvelopedSignatureTransformUrl

Représente l'URI de la transformation de signature enveloppée.Represents the Uniform Resource Identifier (URI) for enveloped signature transformation. Ce champ est constant.This field is constant.

XmlDsigExcC14NTransformUrl XmlDsigExcC14NTransformUrl XmlDsigExcC14NTransformUrl XmlDsigExcC14NTransformUrl

Représente l'URI de la canonisation XML exclusive.Represents the Uniform Resource Identifier (URI) for exclusive XML canonicalization. Ce champ est constant.This field is constant.

XmlDsigExcC14NWithCommentsTransformUrl XmlDsigExcC14NWithCommentsTransformUrl XmlDsigExcC14NWithCommentsTransformUrl XmlDsigExcC14NWithCommentsTransformUrl

Représente l'URI de la canonisation XML exclusive, avec des commentaires.Represents the Uniform Resource Identifier (URI) for exclusive XML canonicalization, with comments. Ce champ est constant.This field is constant.

XmlDsigHMACSHA1Url XmlDsigHMACSHA1Url XmlDsigHMACSHA1Url XmlDsigHMACSHA1Url

Représente l'URI de l'algorithme HMACSHA1 standard pour les signatures numériques XML.Represents the Uniform Resource Identifier (URI) for the standard HMACSHA1 algorithm for XML digital signatures. Ce champ est constant.This field is constant.

XmlDsigMinimalCanonicalizationUrl XmlDsigMinimalCanonicalizationUrl XmlDsigMinimalCanonicalizationUrl XmlDsigMinimalCanonicalizationUrl

Représente l'URI de l'algorithme de canonisation minimal pour les signatures numériques XML.Represents the Uniform Resource Identifier (URI) for the standard minimal canonicalization algorithm for XML digital signatures. Ce champ est constant.This field is constant.

XmlDsigNamespaceUrl XmlDsigNamespaceUrl XmlDsigNamespaceUrl XmlDsigNamespaceUrl

Représente l'URI de l'espace de noms standard pour les signatures numériques XML.Represents the Uniform Resource Identifier (URI) for the standard namespace for XML digital signatures. Ce champ est constant.This field is constant.

XmlDsigRSASHA1Url XmlDsigRSASHA1Url XmlDsigRSASHA1Url XmlDsigRSASHA1Url

Représente l'URI de la méthode de signature RSA standard pour les signatures numériques XML.Represents the Uniform Resource Identifier (URI) for the standard RSA signature method for XML digital signatures. Ce champ est constant.This field is constant.

XmlDsigRSASHA256Url XmlDsigRSASHA256Url XmlDsigRSASHA256Url XmlDsigRSASHA256Url

Représente l’identificateur de ressource uniforme (URI) de la variation de méthode de signature SHA-256 RSA pour les signatures numériques XML.Represents the Uniform Resource Identifier (URI) for the RSA SHA-256 signature method variation for XML digital signatures. Ce champ est constant.This field is constant.

XmlDsigRSASHA384Url XmlDsigRSASHA384Url XmlDsigRSASHA384Url XmlDsigRSASHA384Url

Représente l’URI (Uniform Resource Identifier) de la variation de méthode de signature SHA-384 RSA pour les signatures numériques XML.Represents the Uniform Resource Identifier (URI) for the RSA SHA-384 signature method variation for XML digital signatures. Ce champ est constant.This field is constant.

XmlDsigRSASHA512Url XmlDsigRSASHA512Url XmlDsigRSASHA512Url XmlDsigRSASHA512Url

Représente l’identificateur de ressource uniforme (URI) de la variation de méthode de signature SHA-512 RSA pour les signatures numériques XML.Represents the Uniform Resource Identifier (URI) for the RSA SHA-512 signature method variation for XML digital signatures. Ce champ est constant.This field is constant.

XmlDsigSHA1Url XmlDsigSHA1Url XmlDsigSHA1Url XmlDsigSHA1Url

Représente l’URI (Uniform Resource Identifier) de la méthode digest SHA1 standard pour les signatures numériques XML.Represents the Uniform Resource Identifier (URI) for the standard SHA1 digest method for XML digital signatures. Ce champ est constant.This field is constant.

XmlDsigSHA256Url XmlDsigSHA256Url XmlDsigSHA256Url XmlDsigSHA256Url

Représente l’URI (Uniform Resource Identifier) de la méthode digest SHA256 standard pour les signatures numériques XML.Represents the Uniform Resource Identifier (URI) for the standard SHA256 digest method for XML digital signatures. Ce champ est constant.This field is constant.

XmlDsigSHA384Url XmlDsigSHA384Url XmlDsigSHA384Url XmlDsigSHA384Url

Représente l’URI (Uniform Resource Identifier) de la méthode digest SHA384 standard pour les signatures numériques XML.Represents the Uniform Resource Identifier (URI) for the standard SHA384 digest method for XML digital signatures. Ce champ est constant.This field is constant.

XmlDsigSHA512Url XmlDsigSHA512Url XmlDsigSHA512Url XmlDsigSHA512Url

Représente l’URI (Uniform Resource Identifier) de la méthode digest SHA512 standard pour les signatures numériques XML.Represents the Uniform Resource Identifier (URI) for the standard SHA512 digest method for XML digital signatures. Ce champ est constant.This field is constant.

XmlDsigXPathTransformUrl XmlDsigXPathTransformUrl XmlDsigXPathTransformUrl XmlDsigXPathTransformUrl

Représente l'URI de XPath (XML Path Language).Represents the Uniform Resource Identifier (URI) for the XML Path Language (XPath). Ce champ est constant.This field is constant.

XmlDsigXsltTransformUrl XmlDsigXsltTransformUrl XmlDsigXsltTransformUrl XmlDsigXsltTransformUrl

Représente l'URI des transformations XSLT.Represents the Uniform Resource Identifier (URI) for XSLT transformations. Ce champ est constant.This field is constant.

XmlLicenseTransformUrl XmlLicenseTransformUrl XmlLicenseTransformUrl XmlLicenseTransformUrl

Représente l'URI de l'algorithme de transformation de licence utilisé pour normaliser les licences XrML pour signatures.Represents the Uniform Resource Identifier (URI) for the license transform algorithm used to normalize XrML licenses for signatures.

Propriétés

EncryptedXml EncryptedXml EncryptedXml EncryptedXml

Obtient ou définit un objet EncryptedXml qui définit les règles de traitement du chiffrement XML.Gets or sets an EncryptedXml object that defines the XML encryption processing rules.

KeyInfo KeyInfo KeyInfo KeyInfo

Obtient ou définit l'objet KeyInfo de l'objet SignedXml en cours.Gets or sets the KeyInfo object of the current SignedXml object.

Resolver Resolver Resolver Resolver

Définit l'objet XmlResolver en cours.Sets the current XmlResolver object.

SafeCanonicalizationMethods SafeCanonicalizationMethods SafeCanonicalizationMethods SafeCanonicalizationMethods

Obtient les noms des méthodes dont les algorithmes de canonisation sont explicitement autorisés.Gets the names of methods whose canonicalization algorithms are explicitly allowed.

Signature Signature Signature Signature

Obtient l'objet Signature de l'objet SignedXml en cours.Gets the Signature object of the current SignedXml object.

SignatureFormatValidator SignatureFormatValidator SignatureFormatValidator SignatureFormatValidator

Obtient un délégué qui sera appelé pour valider le format (et non la sécurité de chiffrement) d'une signature XML.Gets a delegate that will be called to validate the format (not the cryptographic security) of an XML signature.

SignatureLength SignatureLength SignatureLength SignatureLength

Obtient la longueur de la signature pour l'objet SignedXml actuel.Gets the length of the signature for the current SignedXml object.

SignatureMethod SignatureMethod SignatureMethod SignatureMethod

Obtient la méthode de signature de l'objet SignedXml actuel.Gets the signature method of the current SignedXml object.

SignatureValue SignatureValue SignatureValue SignatureValue

Obtient la valeur de signature de l'objet SignedXml actuel.Gets the signature value of the current SignedXml object.

SignedInfo SignedInfo SignedInfo SignedInfo

Obtient l'objet SignedInfo de l'objet SignedXml en cours.Gets the SignedInfo object of the current SignedXml object.

SigningKey SigningKey SigningKey SigningKey

Obtient ou définit la clé de l'algorithme asymétrique utilisée pour signer un objet SignedXml.Gets or sets the asymmetric algorithm key used for signing a SignedXml object.

SigningKeyName SigningKeyName SigningKeyName SigningKeyName

Obtient ou définit le nom de la clé installée à utiliser pour signer l'objet SignedXml.Gets or sets the name of the installed key to be used for signing the SignedXml object.

Méthodes

AddObject(DataObject) AddObject(DataObject) AddObject(DataObject) AddObject(DataObject)

Ajoute un objet DataObject à la liste des objets à signer.Adds a DataObject object to the list of objects to be signed.

AddReference(Reference) AddReference(Reference) AddReference(Reference) AddReference(Reference)

Ajoute un objet Reference à l'objet SignedXml qui décrit une méthode Digest, valeur Digest et transformation à utiliser pour créer une signature numérique XML.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() CheckSignature() CheckSignature() CheckSignature()

Détermine si la propriété Signature est vérifiée comme valide avec la clé publique contenue dans la signature.Determines whether the Signature property verifies using the public key in the signature.

CheckSignature(AsymmetricAlgorithm) CheckSignature(AsymmetricAlgorithm) CheckSignature(AsymmetricAlgorithm) CheckSignature(AsymmetricAlgorithm)

Détermine si la propriété Signature est vérifiée comme valide pour la clé spécifiée.Determines whether the Signature property verifies for the specified key.

CheckSignature(KeyedHashAlgorithm) CheckSignature(KeyedHashAlgorithm) CheckSignature(KeyedHashAlgorithm) CheckSignature(KeyedHashAlgorithm)

Détermine si la propriété Signature est vérifiée comme valide pour l'algorithme MAC (Message Authentication Code) spécifié.Determines whether the Signature property verifies for the specified message authentication code (MAC) algorithm.

CheckSignature(X509Certificate2, Boolean) CheckSignature(X509Certificate2, Boolean) CheckSignature(X509Certificate2, Boolean) CheckSignature(X509Certificate2, Boolean)

Détermine si la propriété Signature est vérifiée comme valide pour l'objet X509Certificate2 spécifié et, éventuellement, si le certificat est valide.Determines whether the Signature property verifies for the specified X509Certificate2 object and, optionally, whether the certificate is valid.

CheckSignatureReturningKey(AsymmetricAlgorithm) CheckSignatureReturningKey(AsymmetricAlgorithm) CheckSignatureReturningKey(AsymmetricAlgorithm) CheckSignatureReturningKey(AsymmetricAlgorithm)

Détermine si la propriété Signature est vérifiée comme valide avec la clé publique contenue dans la signature.Determines whether the Signature property verifies using the public key in the signature.

ComputeSignature() ComputeSignature() ComputeSignature() ComputeSignature()

Calcule une signature numérique XML.Computes an XML digital signature.

ComputeSignature(KeyedHashAlgorithm) ComputeSignature(KeyedHashAlgorithm) ComputeSignature(KeyedHashAlgorithm) ComputeSignature(KeyedHashAlgorithm)

Calcule une signature numérique XML en utilisant l'algorithme MAC spécifié.Computes an XML digital signature using the specified message authentication code (MAC) algorithm.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Détermine si l'objet spécifié est identique à l'objet actuel.Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Fait office de fonction de hachage par défaut.Serves as the default hash function.

(Inherited from Object)
GetIdElement(XmlDocument, String) GetIdElement(XmlDocument, String) GetIdElement(XmlDocument, String) GetIdElement(XmlDocument, String)

Retourne l'objet XmlElement avec l'ID spécifié à partir de l'objet XmlDocument spécifié.Returns the XmlElement object with the specified ID from the specified XmlDocument object.

GetPublicKey() GetPublicKey() GetPublicKey() GetPublicKey()

Retourne la clé publique d'une signature.Returns the public key of a signature.

GetType() GetType() GetType() GetType()

Obtient le Type de l'instance actuelle.Gets the Type of the current instance.

(Inherited from Object)
GetXml() GetXml() GetXml() GetXml()

Retourne la représentation XML d'un objet SignedXml.Returns the XML representation of a SignedXml object.

LoadXml(XmlElement) LoadXml(XmlElement) LoadXml(XmlElement) LoadXml(XmlElement)

Charge un état de SignedXml à partir d'un élément XML.Loads a SignedXml state from an XML element.

MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Crée une copie superficielle du Object actuel.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

Retourne une chaîne qui représente l'objet actuel.Returns a string that represents the current object.

(Inherited from Object)

S’applique à

Voir aussi