方法: デジタル署名で XML ドキュメントに署名するHow to: Sign XML Documents with Digital Signatures

System.Security.Cryptography.Xml 名前空間のクラスを使用すると、XML ドキュメントまたは XML ドキュメントの一部にデジタル署名で署名することができます。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. XML デジタル署名 (XMLDSIG) を使用すると、データが署名後に変更されなかったことを確認できます。XML digital signatures (XMLDSIG) allow you to verify that data was not altered after it was signed. XMLDSIG 標準の詳細については、World Wide Web Consortium (W3C) の推奨事項 XML 署名の構文と処理 を参照してください。For more information about the XMLDSIG standard, see the World Wide Web Consortium (W3C) recommendation XML Signature Syntax and Processing.

この手順のコード例は、XML ドキュメント全体にデジタル署名する方法、および <Signature> 要素内のドキュメントに署名を付す方法を示しています。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. この例では、RSA 署名キーを作成し、キーをセキュリティで保護されたキー コンテナーに追加してから、キーを使用して 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. キーは、XML デジタル署名を確認するために取得したり、別の XML ドキュメントの署名に使用したりすることができます。The key can then be retrieved to verify the XML digital signature, or can be used to sign another XML document.

この手順を使用して作成された XML デジタル署名を確認する方法については、次を参照してください。方法。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.

XML ドキュメントにデジタル署名するにはTo digitally sign an XML document

  1. CspParameters オブジェクトを作成し、キーのコンテナーの名前を指定します。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. RSACryptoServiceProvider クラスを使用して非対称キーを生成します。Generate an asymmetric key using the RSACryptoServiceProvider class. CspParameters オブジェクトを RSACryptoServiceProvider クラスのコンストラクターに渡すと、キーは自動的にキー コンテナーに保存されます。The key is automatically saved to the key container when you pass the CspParameters object to the constructor of the RSACryptoServiceProvider class. このキーは、XML ドキュメントの署名に使用されます。This key will be used to sign the XML document.

    RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
    
    Dim rsaKey As New RSACryptoServiceProvider(cspParams)
    
  3. ディスクから XML ファイルを読み込んで XmlDocument オブジェクトを作成します。Create an XmlDocument object by loading an XML file from disk. XmlDocument オブジェクトには、暗号化する XML 要素が含まれています。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. SignedXml オブジェクトを新規作成し、それに 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. 署名する RSA キーを SignedXml オブジェクトに追加します。Add the signing RSA key to the SignedXml object.

    signedXml.SigningKey = rsaKey;
    
    signedXml.SigningKey = rsaKey
    
  6. 署名内容について記述する Reference オブジェクトを作成します。Create a Reference object that describes what to sign. ドキュメント全体に署名するには、Uri プロパティを "" に設定します。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. XmlDsigEnvelopedSignatureTransform オブジェクトを Reference オブジェクトに追加します。Add an XmlDsigEnvelopedSignatureTransform object to the Reference object. 変換を使用すると、検証側は、署名側が使用した方法と同一の方法で XML データを表すことができます。A transformation allows the verifier to represent the XML data in the identical manner that the signer used. XML データはさまざまな方法で表すことができるため、この手順は検証にとって重要です。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. Reference オブジェクトを SignedXml オブジェクトに追加します。Add the Reference object to the SignedXml object.

    signedXml.AddReference(reference);
    
    signedXml.AddReference(reference)
    
  9. ComputeSignature メソッドを呼び出して署名を計算します。Compute the signature by calling the ComputeSignature method.

    signedXml.ComputeSignature();
    
    signedXml.ComputeSignature()
    
  10. 署名の XML 表記 (<Signature> 要素) を取得して、新しい XmlElement オブジェクトに保存します。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. XmlDocument オブジェクトに要素を追加します。Append the element to the XmlDocument object.

    xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
    
    xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, True))
    
  12. ドキュメントを保存します。Save the document.

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

Example

この例では、test.xml という名前のファイルがコンパイル済みのプログラムと同じディレクトリに存在することを前提としています。This example assumes that a file named test.xml exists in the same directory as the compiled program. 次の XML を test.xml というファイルに配置し、この例で使用することができます。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

コードのコンパイルCompiling the Code

.NET Framework セキュリティ.NET Framework Security

非対称キー ペアの秘密キーをプレーンテキストで保存または転送しないでください。Never store or transfer the private key of an asymmetric key pair in plaintext. 対称暗号化キーと非対称暗号化キーの詳細については、暗号化と復号化キーを生成するを参照してください。For more information about symmetric and asymmetric cryptographic keys, see Generating Keys for Encryption and Decryption.

秘密キーをソース コードに直接埋め込まないでください。Never embed a private key directly into your source code. 埋め込まれたキーは、アセンブリをIldasm.exe (IL 逆アセンブラー)またはメモ帳などのテキスト エディターで開くことで、簡単に読み取ることができます。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.

関連項目See also