Como: Assinar os documentos XML com assinaturas digitais

Você pode usar as classes de System.Security.Cryptography.Xml o namespace para assinar um documento XML ou parte de um documento XML com uma assinatura digital. Assinaturas digitais XML (XMLDSIG) permitem que você verifique quais dados não foram alterados depois de assinados. Para obter mais informações sobre o padrão XMLDSIG, consulte a recomendação do World Wide Web Consortium (W3C) sintaxe de assinatura XML e o processamento.

O exemplo de código neste procedimento demonstra como digitalmente, assinar um documento XML inteiro e anexar a assinatura ao documento em um <Signature> elemento. The exemplo CREATES an RSA Autenticando chave, adicionado uma chave segura de contêiner, e usando essa chave para assinar digitalmente um documento XML. A chave pode ser recuperada para verificar a assinatura digital XML ou pode ser usada para assinar a outro documento XML.

Para obter informações sobre como verificar uma assinatura digital XML que foi criada usando este procedimento, consulte Como: Verifique se as assinaturas digitais de documentos XML.

Para assinar digitalmente um documento XML

  1. Criar um CspParameters de objeto e especifique o nome do contêiner de chave.

    Dim cspParams As New CspParameters()
    cspParams.KeyContainerName = "XML_DSIG_RSA_KEY"
    
    CspParameters cspParams = new CspParameters();
    cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";
    
  2. Gerar um assimétrica chave usando o RSACryptoServiceProvider classe. A chave é salvo automaticamente para o recipiente de chave quando você passar o CspParameters o objeto para o construtor da RSACryptoServiceProvider classe. Essa chave será usada para assinar o documento XML.

    Dim rsaKey As New RSACryptoServiceProvider(cspParams)
    
    RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
    
  3. Criar um XmlDocument objeto carregando um arquivo XML a partir do disco. O XmlDocument objeto contém o elemento XML para criptografar.

    Dim xmlDoc As New XmlDocument()
    
    ' Load an XML file into the XmlDocument object.
    xmlDoc.PreserveWhitespace = True
    xmlDoc.Load("test.xml")
    
    XmlDocument xmlDoc = new XmlDocument();
    
    // Load an XML file into the XmlDocument object.
    xmlDoc.PreserveWhitespace = true;
    xmlDoc.Load("test.xml");
    
  4. Criar uma nova SignedXml object e passar a XmlDocument o objeto para o proprietário.

    Dim signedXml As New SignedXml(xmlDoc)
    
    SignedXml signedXml = new SignedXml(xmlDoc);
    
  5. Adicionar a chave de assinatura RSA para o SignedXml objeto.

    signedXml.SigningKey = Key
    
    signedXml.SigningKey = Key;
    
  6. Criar um Reference objeto que descreve o que sinal. Para assinar o documento inteiro, defina a Uri propriedade para "".

    ' Create a reference to be signed.
    Dim reference As New Reference()
    reference.Uri = ""
    
    // Create a reference to be signed.
    Reference reference = new Reference();
    reference.Uri = "";
    
  7. Adicionar um XmlDsigEnvelopedSignatureTransform o objeto para o Reference objeto. Uma transformação permite que o verificador represente os dados XML da maneira idêntica que usou o signatário. Dados XML podem ser representados de diferentes maneiras, portanto essa etapa é vital para verificação.

    Dim env As New XmlDsigEnvelopedSignatureTransform()
    reference.AddTransform(env)
    
    XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
    reference.AddTransform(env);
    
  8. Adicionar o Reference o objeto para o SignedXml objeto.

    signedXml.AddReference(reference)
    
    signedXml.AddReference(reference);
    
  9. A assinatura de computação, chamando o ComputeSignature método.

    signedXml.ComputeSignature()
    
    signedXml.ComputeSignature();
    
  10. Recuperar a representação XML da assinatura (um <Signature> elemento) e salvá-lo em uma nova XmlElement objeto.

    Dim xmlDigitalSignature As XmlElement = signedXml.GetXml()
    
    XmlElement xmlDigitalSignature = signedXml.GetXml();
    
  11. Acrescentar o elemento para o XmlDocument objeto.

    xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, True))
    
    xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
    
  12. Salvar o documento.

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

Exemplo

Este exemplo assume que um arquivo chamado test.xml existe no mesmo diretório que o programa compilado. Você pode colocar o XML a seguir em um arquivo denominado test.xml e usá-lo com este exemplo.

<root>
    <creditcard>
        <number>19834209</number>
        <expiry>02/02/2002</expiry>
    </creditcard>
</root>
Imports System
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 Key As RSA)
        ' Check arguments.
        If xmlDoc Is Nothing Then
            Throw New ArgumentException("xmlDoc")
        End If
        If Key Is Nothing Then
            Throw New ArgumentException("Key")
        End If
        ' Create a SignedXml object.
        Dim signedXml As New SignedXml(xmlDoc)
        ' 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.
        xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, True))
    End Sub
End Module
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 Key)
    {
        // Check arguments.
        if (xmlDoc == null)
            throw new ArgumentException("xmlDoc");
        if (Key == null)
            throw new ArgumentException("Key");

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

        // 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.
        xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));

    }
}

Compilando o código

Segurança

Nunca armazene ou transfira a chave particular de um par de chaves assimétrica em texto sem formatação. Para obter mais informações sobre chaves de criptografia simétricas e assimétricas, consulte A geração de chaves de criptografia e descriptografia.

Nunca incorporar uma chave particular diretamente em sua origem Código. Chaves incorporadas podem ser facilmente lidas a partir de um assembly usando o Ildasm. exe (desmontador MSIL) ou abrindo o assembly em um editor de texto como o bloco de notas.

Consulte também

Tarefas

Como: Verifique se as assinaturas digitais de documentos XML

Referência

System.Security.Cryptography.Xml

Outros recursos

Criptografia XML e assinaturas digitais