1.XML文書に電子証明書で署名する

 .NET Frameworkには、XML文書を容易に扱えるクラスが用意されています。さらに、そのXML文書に暗号化や電子署名を施すクラスもあります。ここでは、それらのクラスを使って電子署名する方法を説明します。なおここで電子署名された文書は、2.署名されたXML文書を検証する で署名検証します。
 .NET FrameworkXML署名は、W3C 勧告『XML-Signature Syntax and Processing』に準拠しています。

 JavaでXML文書に電子署名する方法は、4.XML文書に署名する(Java)で説明しています。

1.1 概要

 .NET FrameworkによるXML文書への署名方法をC#言語で説明します。
 関連の名前空間は以下のとおりです。

  • System.Xml
    XML文書を扱うためのAPIを備えています。
  • System.Security.cryptography
    データの安全なエンコーディングやデコーディング、およびハッシュ演算、乱数生成、メッセージ認証などの操作を含む、暗号サービスが提供されます。
  • System.Security.cryptography.Xml
    XML デジタル署名の作成と検証をサポートするクラスを含んでいます。この名前空間のクラスは、W3C 勧告『XML-Signature Syntax and Processing』(http://www.w3.org/TR/xmldsig-core/)が実装されています。
  • System.Security.cryptography.X509Certificates
    共通言語ランタイムにおける Authenticode X.509 v.3 証明書の実装が格納されています。この証明書は、証明書の所有者を一意に、そして確実に識別する秘密キーで署名されているものです。
 大まかな手順は、以下のとおりです。
  • 署名されるXML文書をロードする。
  • SignedXMLクラスを準備し電子署名に備える。
  • <Reference>を用意し署名方法を指定する。
  • 電子証明書を準備する。
  • 署名用の鍵を指定する。
  • 証明書情報を準備する。
  • 電子署名を実施する。
  • 署名したXML文書を取得する。
 なお、電子署名される文書は以下のようなものです。(original.xmlとして利用するものです。)
<root>
    <creditcard>
        <number>19834209</number>
        <expiry>02/02/2002</expiry>
    </creditcard>
</root>

注意: 電子証明書の有効性や利用目的などは検証していませんのでご注意ください。


1.2 署名されるXML文書をロードする

 まず、署名されるXML文書をロードします。ここでは、事前に準備した文書を読み取ることで準備とします。
 以下にコードを記します。
using System;
using System.Xml;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Security.Cryptography.X509Certificates;

namespace dsig
{
    class dsig
    {
        static void Main(string[] args)
        {
            // XMLドキュメントを生成する
            XmlDocument doc = new XmlDocument();

            // XmlDocumentのフォーマットを指定し、
            // オブジェクトにXMLデータを読み込む
            doc.PreserveWhitespace = true;
            doc.Load("original.xml");

1.3 SignedXMLクラスを準備する

 署名される文書を使って電子署名を施すオブジェクトを生成します。
 以下に、コードを記します。
            // SignedXmlオブジェクト生成
            SignedXml signedXml = new SignedXml(doc);

1.4 <Reference>を用意し署名方法を指定

 準備したXML文書全体に署名しますので、Envelopedを指定します。
 以下にコードを記します。
            // <Reference>オブジェクトを生成
            Reference reference = new Reference();
            reference.Uri = "";

            // "Enveloped" transformationを<Reference>に指定
            XmlDsigEnvelopedSignatureTransform env
                    = new XmlDsigEnvelopedSignatureTransform();
            reference.AddTransform(env);

            // <Reference>をSignedXmlに追加
            signedXml.AddReference(reference);
全体に署名する以外に、部分に署名する、外部参照に署名するなどがありますので、必要に応じて指定します。
目次 <<< >>> 次のページ


(記載の会社名および製品名は、各社の登録商標および商標です。)

1. XML文書に電子証明書で署名する
1.1 概要
1.2 署名されるXML文書をロードする
1.3 SignedXMLクラスを準備する
1.4 <Reference>を用意し署名方法を指定
1.5 電子証明書を準備する
1.6 署名用の鍵を指定
1.7 証明書情報を準備
1.8 電子署名を実施
1.9 署名したXML文書を取得
1.10 署名結果およびサンプル
2. 署名されたXML文書を検証する
2.1 概要
2.2 署名されたXML文書をロードする
2.3 SignedXMLクラスを準備する
2.4 キーProviderを準備する
2.5 "Signature"ノードを取り出す
2.6 署名を検証する
2.7 注意
4.1 XML文書に署名する (Java)
4.1 XML署名とは
4.2 署名されるXML文書
4.3 署名されたXML文書(結果)
4.4 電子署名 Javaアプリ
株)トラスト・ソフトウェア・システム
暗号化・電子署名・タイムスタンプ ライブラリ作成します。
お問い合わせください。
会員用ログイン
ID:
パスワード:
ログインすると、一般公開していないページを閲覧できます。