Procédure : signer des documents XML avec des signatures numériquesHow to: Sign XML Documents with Digital Signatures

Vous pouvez utiliser les classes de l'espace de noms System.Security.Cryptography.Xml pour signer un document XML ou une partie d'un document XML avec une signature numérique.You can use the classes in the System.Security.Cryptography.Xml namespace to sign an XML document or part of an XML document with a digital signature. Les signatures numériques XML (XMLDSIG) vous permettent de vérifier que les données n'ont pas été modifiées après leur signature.XML digital signatures (XMLDSIG) allow you to verify that data was not altered after it was signed. Pour plus d’informations sur la norme XMLDSIG, consultez la recommandation du World Wide Web Consortium (W3C) XML Signature Syntax and Processing.For more information about the XMLDSIG standard, see the World Wide Web Consortium (W3C) recommendation XML Signature Syntax and Processing.

L’exemple de code dans cette procédure montre comment signer un document XML entier numériquement et d’attacher la signature au document dans un <Signature> élément.The code example in this procedure demonstrates how to digitally sign an entire XML document and attach the signature to the document in a <Signature> element. L'exemple crée une clé de signature RSA, ajoute la clé à un conteneur de clé sécurisé, puis utilise la clé pour signer numériquement un document XML.The example creates an RSA signing key, adds the key to a secure key container, and then uses the key to digitally sign an XML document. La clé peut ensuite être récupérée pour vérifier la signature numérique XML ou peut être utilisée pour signer un autre document XML.The key can then be retrieved to verify the XML digital signature, or can be used to sign another XML document.

Pour plus d’informations sur la façon de vérifier une signature numérique XML qui a été créée à l’aide de cette procédure, consultez Comment : Vérifier les Signatures numériques de Documents XML.For information about how to verify an XML digital signature that was created using this procedure, see How to: Verify the Digital Signatures of XML Documents.

Pour signer numériquement un document XMLTo digitally sign an XML document

  1. Créez un objet CspParameters et spécifiez le nom du conteneur de clé.Create a CspParameters object and specify the name of the key container.

    CspParameters cspParams = new CspParameters();
    cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";
    
    Dim cspParams As New CspParameters()
    cspParams.KeyContainerName = "XML_DSIG_RSA_KEY"
    
  2. Générez une clé asymétrique à l'aide de la classe RSACryptoServiceProvider.Generate an asymmetric key using the RSACryptoServiceProvider class. La clé est automatiquement enregistrée dans le conteneur de clé quand vous passez l'objet CspParameters au constructeur de la classe RSACryptoServiceProvider.The key is automatically saved to the key container when you pass the CspParameters object to the constructor of the RSACryptoServiceProvider class. Cette clé sera utilisée pour signer le document XML.This key will be used to sign the XML document.

    RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
    
    Dim rsaKey As New RSACryptoServiceProvider(cspParams)
    
  3. Créez un objet XmlDocument en chargeant un fichier XML à partir du disque.Create an XmlDocument object by loading an XML file from disk. L'objet XmlDocument contient l'élément XML à chiffrer.The XmlDocument object contains the XML element to encrypt.

    XmlDocument xmlDoc = new XmlDocument();
    
    // Load an XML file into the XmlDocument object.
    xmlDoc.PreserveWhitespace = true;
    xmlDoc.Load("test.xml");
    
    Dim xmlDoc As New XmlDocument()
    
    ' Load an XML file into the XmlDocument object.
    xmlDoc.PreserveWhitespace = True
    xmlDoc.Load("test.xml")
    
  4. Créez un objet SignedXml et passez-lui l'objet XmlDocument.Create a new SignedXml object and pass the XmlDocument object to it.

    SignedXml signedXml = new SignedXml(xmlDoc);
    
    Dim signedXml As New SignedXml(xmlDoc)
    
  5. Ajoutez la clé de signature RSA à l'objet SignedXml.Add the signing RSA key to the SignedXml object.

    signedXml.SigningKey = rsaKey;
    
    signedXml.SigningKey = rsaKey
    
  6. Créez un objet Reference décrivant les éléments à signer.Create a Reference object that describes what to sign. Pour signer l'intégralité du document, définissez la propriété Uri sur "".To sign the entire document, set the Uri property to "".

    // Create a reference to be signed.
    Reference reference = new Reference();
    reference.Uri = "";
    
    ' Create a reference to be signed.
    Dim reference As New Reference()
    reference.Uri = ""
    
  7. Ajoutez un objet XmlDsigEnvelopedSignatureTransform à l'objet Reference.Add an XmlDsigEnvelopedSignatureTransform object to the Reference object. Une transformation permet au vérificateur de représenter les données XML de la même manière que celle utilisée par le signataire.A transformation allows the verifier to represent the XML data in the identical manner that the signer used. Les données XML peuvent être représentées de différentes façons, cette étape est donc vitale pour la vérification.XML data can be represented in different ways, so this step is vital to verification.

    XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
    reference.AddTransform(env);
    
    Dim env As New XmlDsigEnvelopedSignatureTransform()
    reference.AddTransform(env)
    
  8. Ajoutez l'objet Reference à l'objet SignedXml.Add the Reference object to the SignedXml object.

    signedXml.AddReference(reference);
    
    signedXml.AddReference(reference)
    
  9. Calculez la signature en appelant la méthode ComputeSignature.Compute the signature by calling the ComputeSignature method.

    signedXml.ComputeSignature();
    
    signedXml.ComputeSignature()
    
  10. Récupérer la représentation XML de la signature (un <Signature> élément) et enregistrez-le dans un nouveau XmlElement objet.Retrieve the XML representation of the signature (a <Signature> element) and save it to a new XmlElement object.

    XmlElement xmlDigitalSignature = signedXml.GetXml();
    
    Dim xmlDigitalSignature As XmlElement = signedXml.GetXml()
    
  11. Ajoutez l'élément à l'objet XmlDocument.Append the element to the XmlDocument object.

    xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
    
    xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, True))
    
  12. Enregistrez le document.Save the document.

    xmlDoc.Save("test.xml");
    
    xmlDoc.Save("test.xml")
    

ExempleExample

Cet exemple suppose qu'un fichier nommé test.xml se trouve dans le même répertoire que le programme compilé.This example assumes that a file named test.xml exists in the same directory as the compiled program. Vous pouvez placer le code XML suivant dans un fichier appelé test.xml et l'utiliser avec cet exemple.You can place the following XML into a file called test.xml and use it with this example.

<root>  
    <creditcard>  
        <number>19834209</number>  
        <expiry>02/02/2002</expiry>  
    </creditcard>  
</root>  
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Xml;

public class SignXML
{
    public static void Main(String[] args)
    {
        try
        {
            // Create a new CspParameters object to specify
            // a key container.
            CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";

            // Create a new RSA signing key and save it in the container. 
            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);

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

            // Load an XML file into the XmlDocument object.
            xmlDoc.PreserveWhitespace = true;
            xmlDoc.Load("test.xml");

            // Sign the XML document. 
            SignXml(xmlDoc, rsaKey);

            Console.WriteLine("XML file signed.");

            // Save the document.
            xmlDoc.Save("test.xml");
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }

    // Sign an XML file. 
    // This document cannot be verified unless the verifying 
    // code has the key with which it was signed.
    public static void SignXml(XmlDocument xmlDoc, RSA rsaKey)
    {
        // Check arguments.
        if (xmlDoc == null)
            throw new ArgumentException(nameof(xmlDoc));
        if (rsaKey == null)
            throw new ArgumentException(nameof(rsaKey));

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

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

        // 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.
        xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
    }
}
Imports System.Security.Cryptography
Imports System.Security.Cryptography.Xml
Imports System.Xml

Module SignXML
    Sub Main(ByVal args() As String)
        Try
            ' Create a new CspParameters object to specify
            ' a key container.
            Dim cspParams As New CspParameters()
            cspParams.KeyContainerName = "XML_DSIG_RSA_KEY"
            ' Create a new RSA signing key and save it in the container. 
            Dim rsaKey As New RSACryptoServiceProvider(cspParams)
            ' Create a new XML document.
            Dim xmlDoc As New XmlDocument()

            ' Load an XML file into the XmlDocument object.
            xmlDoc.PreserveWhitespace = True
            xmlDoc.Load("test.xml")
            ' Sign the XML document. 
            SignXml(xmlDoc, rsaKey)

            Console.WriteLine("XML file signed.")

            ' Save the document.
            xmlDoc.Save("test.xml")
        Catch e As Exception
            Console.WriteLine(e.Message)
        End Try
    End Sub

    ' Sign an XML file. 
    ' This document cannot be verified unless the verifying 
    ' code has the key with which it was signed.
    Sub SignXml(ByVal xmlDoc As XmlDocument, ByVal rsaKey As RSA)
        ' Check arguments.
        If xmlDoc Is Nothing Then
            Throw New ArgumentException(NameOf(xmlDoc))
        End If
        If rsaKey Is Nothing Then
            Throw New ArgumentException(NameOf(rsaKey))
        End If
        ' Create a SignedXml object.
        Dim signedXml As New SignedXml(xmlDoc)
        ' Add the key to the SignedXml document.
        signedXml.SigningKey = rsaKey
        ' 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.
        xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, True))
    End Sub
End Module

Compilation du codeCompiling the Code

Sécurité .NET Framework.NET Framework Security

La clé privée d'une paire de clés asymétriques ne doit jamais être stockée ni transférée en texte brut.Never store or transfer the private key of an asymmetric key pair in plaintext. Pour plus d’informations sur les clés de chiffrement symétriques et asymétriques, consultez génération de clés pour le chiffrement et déchiffrement.For more information about symmetric and asymmetric cryptographic keys, see Generating Keys for Encryption and Decryption.

N'incorporez jamais une clé privée directement dans votre code source.Never embed a private key directly into your source code. Les clés incorporées peuvent être lues facilement à partir d’un assembly à l’aide de la Ildasm.exe (désassembleur IL) ou en ouvrant l’assembly dans un éditeur de texte tel que le bloc-notes.Embedded keys can be easily read from an assembly using the Ildasm.exe (IL Disassembler) or by opening the assembly in a text editor such as Notepad.

Voir aussiSee also