1.XML文書に電子証明書で署名する
.NET Frameworkには、XML文書を容易に扱えるクラスが用意されています。さらに、そのXML文書に暗号化や電子署名を施すクラスもあります。ここでは、それらのクラスを使って電子署名する方法を説明します。なおここで電子署名された文書は、2.署名されたXML文書を検証する で署名検証します。
.NET FrameworkXML署名は、W3C 勧告『XML-Signature Syntax and Processing』に準拠しています。
JavaでXML文書に電子署名する方法は、4.XML文書に署名する(Java)で説明しています。
.NET FrameworkXML署名は、W3C 勧告『XML-Signature Syntax and Processing』に準拠しています。
JavaでXML文書に電子署名する方法は、4.XML文書に署名する(Java)で説明しています。
1.1 概要
.NET FrameworkによるXML文書への署名方法をC#言語で説明します。
関連の名前空間は以下のとおりです。
注意: 電子証明書の有効性や利用目的などは検証していませんのでご注意ください。
関連の名前空間は以下のとおりです。
- System.XmlXML文書を扱うためのAPIを備えています。
- System.Security.cryptographyデータの安全なエンコーディングやデコーディング、およびハッシュ演算、乱数生成、メッセージ認証などの操作を含む、暗号サービスが提供されます。
- System.Security.cryptography.XmlXML デジタル署名の作成と検証をサポートするクラスを含んでいます。この名前空間のクラスは、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文書を取得する。
<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);
全体に署名する以外に、部分に署名する、外部参照に署名するなどがありますので、必要に応じて指定します。
(記載の会社名および製品名は、各社の登録商標および商標です。)