Sdílet prostřednictvím


Postupy: Podepsat dokumenty XML digitálními podpisy

Pro digitální podpis dokumentu jazyka XML nebo jeho části můžete použít třídy v oboru názvů System.Security.Cryptography.Xml. Digitální podpisy XML (XMLDSIG) umožňují ověřit, že data nebyla po podepsání změněna. Další informace o standardních XMLDSIG viz doporučení World Wide Web Consortium (W3C) XML syntaxi Signature a zpracování.

Příklad kódu v tomto postupu ukazuje, jak digitálně podepsat celý dokument XML a připojit k dokumentu podpis v elementu <Signature>. Příklad vytvoří podpisový klíč RSA, přidá klíč do zabezpečeného kontejneru klíčů a poté klíč použije k digitálnímu podpisu dokumentu XML. Klíč lze načíst ověřit digitální podpis XML nebo lze použít jiný XML dokument podepsat.

Informace o tom, jak ověřit digitální podpis XML, který byl vytvořen pomocí tohoto postupu, naleznete v tématu Postupy: Ověření digitálních podpisů XML dokumentů.

Postup pro digitální podpis dokumentu systému Office

  1. Vytvořte objekt CspParameters a zadejte název kontejneru klíčů.

    Dim cspParams As New CspParameters()
    cspParams.KeyContainerName = "XML_DSIG_RSA_KEY"
    
    CspParameters cspParams = new CspParameters();
    cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";
    
  2. Generovat asymetrického klíče pomocí RSACryptoServiceProvider Třída Klíč je automaticky uložen do kontejneru klíčů při předání objektu CspParameters konstruktoru třídy RSACryptoServiceProvider. Tento klíč bude použit k podepsání dokumentu XML.

    Dim rsaKey As New RSACryptoServiceProvider(cspParams)
    
    RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
    
  3. Vytvořte objekt XmlDocument načtením souboru XML z disku. Objekt XmlDocument obsahuje element XML určený k zašifrování.

    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. Vytvořte nový objekt SignedXml a předejte mu objekt XmlDocument.

    Dim signedXml As New SignedXml(xmlDoc)
    
    SignedXml signedXml = new SignedXml(xmlDoc);
    
  5. Přidejte podpisový klíč RSA do objektu SignedXml.

    signedXml.SigningKey = Key
    
    signedXml.SigningKey = Key;
    
  6. Vytvořte objekt Reference, který popisuje, co má být podepsáno. Chcete-li podepsat celý dokument, nastavte vlastnost Uri na "".

    ' 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. Přidejte objekt XmlDsigEnvelopedSignatureTransform k objektu Reference. Transformace umožňuje ověřovateli reprezentovat data XML identickým způsobem, který použil autor podpisu. Data XML lze reprezentovat různými způsoby, proto je tento krok pro ověření zásadní.

    Dim env As New XmlDsigEnvelopedSignatureTransform()
    reference.AddTransform(env)
    
    XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
    reference.AddTransform(env);
    
  8. Přidejte objekt Reference k objektu SignedXml.

    signedXml.AddReference(reference)
    
    signedXml.AddReference(reference);
    
  9. Vypočtěte podpis voláním metody ComputeSignature.

    signedXml.ComputeSignature()
    
    signedXml.ComputeSignature();
    
  10. Načtěte XML reprezentaci podpisu (prvek <Signature>) a uložte jej do nového objektu XmlElement.

    Dim xmlDigitalSignature As XmlElement = signedXml.GetXml()
    
    XmlElement xmlDigitalSignature = signedXml.GetXml();
    
  11. Přidejte prvek do objektu XmlDocument.

    xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, True))
    
    xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
    
  12. Uložte dokument.

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

Příklad

Tento příklad předpokládá, že soubor s názvem test.xml existuje ve stejném adresáři jako Zkompilovaný program. Následující kód jazyka XML můžete umístit do souboru s názvem test.xml a použít jej v tomto příkladu.

<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));

    }
}

Probíhá kompilace kódu

Zabezpečení

Nikdy neukládejte ani nepřenášejte privátní klíč asymetrického páru klíčů jako prostý text. Další informace o symetrických a asymetrických kryptografických klíčích naleznete v tématu Generování klíčů pro šifrování a dešifrování.

Nikdy nevkládejte privátní klíč přímo do zdrojového kódu. Vložené klíče lze snadno přečíst ze sestavení pomocí Ildasm.exe (MSIL Disassembler) nebo otevřením sestavení v textovém editoru, jako je například Poznámkový blok.

Viz také

Úkoly

Postupy: Ověření digitálních podpisů XML dokumentů

Odkaz

System.Security.Cryptography.Xml

Další zdroje

Šifrování XML a digitální podpisy