Gewusst wie: Signieren von XML-Dokumenten mit digitalen Signaturen
Aktualisiert: November 2007
Um ein XML-Dokument teilweise oder vollständig mit einer digitalen Signatur zu versehen, können Sie die Klassen im System.Security.Cryptography.Xml-Namespace verwenden. Durch digitale XML-Signaturen (XMLDSIG) können Daten nach dem Signieren nicht mehr geändert werden. Weitere Informationen über den XMLDSIG-Standard finden Sie in der W3C-Spezifikation (World Wide Web Consortium) unter http://www.w3.org/TR/xmldsig-core/ (nur auf Englisch verfügbar).
Das Codebeispiel in dieser Prozedur veranschaulicht das digitale Signieren eines ganzen XML-Dokuments. Darüber hinaus wird gezeigt, wie die Signatur dem Dokument in einem <Signature>-Element angefügt wird. Im Beispiel wird ein RSA-Signierschlüssel erstellt, einem sicheren Schlüsselcontainer hinzugefügt und anschließend für das digitale Signieren eines XML-Dokuments verwendet. Der Schlüssel kann dann abgerufen werden, um die digitale Signatur des XML-Dokuments zu überprüfen oder um ein weiteres XML-Dokument zu signieren.
Informationen zum Überprüfen einer digitalen XML-Signatur, die mit dieser Prozedur erstellt wurde, finden Sie unter Gewusst wie: Überprüfen der digitalen Signaturen von XML-Dokumenten.
So signieren Sie digital ein XML-Dokument
Erstellen Sie ein CspParameters-Objekt, und geben Sie den Namen des Schlüsselcontainers an.
Dim cspParams As New CspParameters() cspParams.KeyContainerName = "XML_DSIG_RSA_KEY"
CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";
Generieren Sie mit der RSACryptoServiceProvider-Klasse einen symmetrischen Schlüssel. Der Schlüssel wird automatisch im benannten Schlüsselcontainer gespeichert, wenn Sie das CspParameters-Objekt an den Konstruktor der RSACryptoServiceProvider-Klasse übergeben. Dieser Schlüssel wird dann zum Signieren des XML-Dokuments verwendet.
Dim rsaKey As New RSACryptoServiceProvider(cspParams)
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
Erstellen Sie ein XmlDocument-Objekt, indem Sie eine XML-Datei von einem Datenträger laden. Das XmlDocument-Objekt enthält das XML-Element für die Verschlüsselung.
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");
Erstellen Sie ein neues SignedXml-Objekt, und übergeben Sie an dieses Objekt das XmlDocument-Objekt.
Dim signedXml As New SignedXml(Doc)
SignedXml signedXml = new SignedXml(Doc);
Fügen Sie den RSA-Signierschlüssel dem SignedXml-Objekt hinzu.
signedXml.SigningKey = Key
signedXml.SigningKey = Key;
Erstellen Sie ein Reference-Objekt, das beschreibt, was signiert werden soll. Zum Signieren des gesamten Dokuments legen Sie die Uri-Eigenschaft auf "" fest.
' 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 = "";
Fügen Sie dem Reference-Objekt ein XmlDsigEnvelopedSignatureTransform-Objekt hinzu. Mithilfe einer Transformation kann der Prüfer die XML-Daten in genau der gleichen Weise darstellen wie der Signaturgeber. XML-Daten können auf verschiedene Weise dargestellt werden, weshalb dieser Schritt unbedingt zu überprüfen ist.
Dim env As New XmlDsigEnvelopedSignatureTransform() reference.AddTransform(env)
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform(); reference.AddTransform(env);
Fügen Sie das Reference-Objekt dem SignedXml-Objekt hinzu.
signedXml.AddReference(reference)
signedXml.AddReference(reference);
Berechnen Sie die Signatur, indem Sie die ComputeSignature-Methode aufrufen.
signedXml.ComputeSignature()
signedXml.ComputeSignature();
Rufen Sie die XML-Darstellung der Signatur (ein <Signature>-Element) ab, und speichern Sie sie in einem neuen XmlElement-Objekt.
Dim xmlDigitalSignature As XmlElement = signedXml.GetXml()
XmlElement xmlDigitalSignature = signedXml.GetXml();
Fügen Sie das Element dem XmlDocument-Objekt an.
Doc.DocumentElement.AppendChild(Doc.ImportNode(xmlDigitalSignature, True))
Doc.DocumentElement.AppendChild(Doc.ImportNode(xmlDigitalSignature, true));
Speichern Sie das Dokument.
xmlDoc.Save("test.xml")
xmlDoc.Save("test.xml");
Beispiel
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 Doc As XmlDocument, ByVal Key As RSA)
' Check arguments.
If Doc Is Nothing Then
Throw New ArgumentException("Doc")
End If
If Key Is Nothing Then
Throw New ArgumentException("Key")
End If
' 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))
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 Doc, RSA Key)
{
// Check arguments.
if (Doc == null)
throw new ArgumentException("Doc");
if (Key == null)
throw new ArgumentException("Key");
// 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));
}
}
Dieses Beispiel setzt voraus, dass eine Datei mit dem Namen "test.xml" im gleichen Verzeichnis wie das kompilierte Programm vorhanden ist. Sie können die folgende XML in eine Datei mit dem Namen test.xml einfügen und mit diesem Beispiel verwenden.
<root>
<creditcard>
<number>19834209</number>
<expiry>02/02/2002</expiry>
</creditcard>
</root>
Kompilieren des Codes
Um dieses Beispiel zu kompilieren, müssen Sie einen Verweis auf System.Security.dll einfügen.
Fügen Sie die folgenden Namespaces hinzu: System.Xml, System.Security.Cryptography und System.Security.Cryptography.Xml.
Sicherheit
Speichern oder Übertragen Sie den privaten Schlüssel eines asymmetrischen Schlüsselpaares nie in Nur-Text. Weitere Informationen über symmetrische und asymmetrische, kryptografische Schlüssel finden Sie unter Erzeugen von Schlüsseln für die Ver- und Entschlüsselung.
Betten Sie einen privaten Schlüssel nie direkt in den Quellcode ein. Eingebettete Schlüssel können problemlos aus einer Assembly mithilfe von MSIL Disassembler-Tool (Ildasm.exe) oder durch Öffnen der Assembly in einem Text-Editor wie Windows Editor gelesen werden.
Siehe auch
Aufgaben
Gewusst wie: Überprüfen der digitalen Signaturen von XML-Dokumenten
Referenz
System.Security.Cryptography.Xml