次の方法で共有


[方法] InfoPath 2003 オブジェクト モデルを使用してデジタル署名を操作する方法

InfoPath 2003 互換オブジェクト モデルは、デジタル署名をプログラムで操作する機能を提供します。

デジタル署名の機能

InfoPath で使用できるデジタル署名機能では、以下の操作を行うことができます。

  • フォーム全体に署名する、またはフォーム内の署名可能な特定のデータ セットに個別に署名する。

  • 署名対象にできる各データ セットについて、単一の署名または複数の署名が可能かどうかを指定し、その署名間の関係を指定する。たとえば、それらの署名を同等の連署にするのか、それとも新しい各署名を以前のすべての署名の副署にするのかを指定できます。

  • ユーザーがフォームに署名したときにフォームに表示されるメッセージを指定する。

  • 文書に署名を挿入し、それを確認する。

  • セキュリティ向上のために各署名に追加された検証可能な非否認情報を確認する。この追加情報には、各署名者に表示されたフォームのビューが含まれています。この追加情報は署名の一部になっていて、署名を無効にすることなく削除することはできません。このデータは、フォーム内の署名をクリックして [デジタル署名の確認] ダイアログ ボックスを表示することにより、いつでも再表示できます。

  • デジタル署名の操作にオブジェクト モデルを活用する。デジタル署名のオブジェクト モデルを通じて、署名ブロックにカスタム情報を完全に信頼できる形で追加できます。

デジタル署名のオブジェクト モデルの概要

イベント

デジタル署名のオブジェクト モデルには、次のイベントがあります。

名前 説明

OnSign

署名するための一連の署名データが選択されたときに発生します。

このイベントを使用すると、デジタル署名に格納されているデータを操作することができます。たとえば、信頼されるタイムスタンプ サーバーからデータを追加したり、トランザクションのサーバー側副署名を追加したりできます。また、このイベントを使用すると、現在のユーザーが特定のグループのメンバでない場合に署名を拒否することもできます。

OnSign イベントは、SignEventObject オブジェクトへの参照を返します。このオブジェクトには、次のプロパティが含まれています。

名前 説明

ReturnStatus

OnSign イベントから返された状態を示す Boolean 値を取得または設定します。

SignedDataBlock

OnSign イベントを発生させた署名済みデータ ブロックを取得します。

XDocument

OnSign イベントに関連付けられている XDocument オブジェクトへの参照を取得します。

コレクションおよびオブジェクト

デジタル署名のオブジェクト モデルには、次のコレクションがあります。

名前 説明

SignedDataBlocksCollection

フォーム定義ファイル (.xsf) で定義されているフォーム テンプレート内の SignedDataBlockObject オブジェクトのコレクション。

SignedDataBlocksCollection コレクションには、フォームに関連付けられている SignedDataBlockObjects オブジェクトにアクセスするためのプロパティがあります。 SignedDataBlocks コレクションへのアクセスには、XDocument オブジェクトの SignedDataBlocks プロパティを使用します。

SignaturesCollection

フォーム内の各 SignedDataBlockObject に対する SignatureObject のコレクションが格納されています。

SignaturesCollection コレクションには、フォームに関連付けられている SignatureObject オブジェクトへのアクセスや、署名の作成に使用できるプロパティとメソッドが実装されています。このコレクションには、SignedDataBlockObject オブジェクトを通じてアクセスできます。

SignaturesCollection コレクションの Create メソッドを使用する際には、SignatureObject オブジェクトに対して Sign メソッドを呼び出すまでは署名が書き込まれないことを覚えておいてください。これらのメソッドは、完全に信頼されたフォーム テンプレートの OnSign イベント ハンドラからしか呼び出せません。

デジタル署名のオブジェクト モデルには、次のオブジェクトがあります。

名前 説明

SignedDataBlockObject

フォーム内の署名可能な一連のデータを表します。SignedDataBlock オブジェクトには、署名可能なデータ セットをプログラムで操作するために使用できる多数のプロパティと 1 つのメソッドがあります。

SignatureObject

フォームまたはフォーム内の署名可能な一連のデータに追加されたデジタル署名を表します。SignatureObject コレクションには、デジタル署名に関する情報の取得に使用できる各プロパティ、および XML デジタル署名ブロックの書き込みとその暗号化ハッシュ値の計算のための Sign メソッドが実装されています。

CertificateObject

署名の作成に使用された X.509 デジタル証明書を表します。

プログラムでデジタル署名を操作する

InfoPath 2003 互換オブジェクト モデルには、デジタル署名をプログラムによって操作するための各種メンバがあります。特に、完全に信頼されたフォームでは、次のようなタイムラインに従って、署名ブロックをコミットする前に署名ブロックにカスタム情報を追加することができます。

  1. ユーザーがフォームにデジタル署名を追加する操作を開始します。

  2. [デジタル署名ウィザード] の最初のパネルが表示されます。

  3. SignedDataBlockObject オブジェクトによって表された選択中のデータの OnSign イベントが発生し、SignedDataBlockObjectSign メソッドおよび SignaturesCollection コレクションの Create メソッドが実行されます。

  4. 任意のオプション カスタム操作が実行されます。

  5. SignatureObjectSign メソッドが実行されます。

  6. 署名に使用する証明書を選択するためのウィザードの 2 つ目のパネル、およびコメントを入力するための 3 つ目のパネルが表示されます。

  7. 非否認情報が表示されます (この情報は、後から [デジタル署名の確認] ダイアログ ボックスでも確認できます)。

  8. [署名] ボタンがクリックされると、そのフォーム用の署名のコレクションに署名が追加されます。

次の例は、[署名] ダイアログ ボックスを開いて、信頼できるタイムスタンプ サービスから取得したタイムスタンプ値で副署の署名を行います。

[InfoPathEventHandler(EventType=InfoPathEventType.OnSign)]
public void OnSign(SignEvent e)
{
    Signature signature = e.SignedDataBlock.Signatures.Create();
    // Invoke the Sign dialog box to sign the data block.
    signature.Sign();
    // Countersign the signature with a trusted timestamp
    // Get the XML node storing the signature block
    IXMLDOMNode oNodeSig = signature.SignatureBlockXmlNode;
    IXMLDOMNode oNodeSigValue = oNodeSig.selectSingleNode(".//*[local-name(.)='signatureValue']");
    // Get timestamp from a trusted timestamp service (fictitious).
    MyTrustedTimeStampService s = new MyTrustedTimeStampService();
    string strVerifiedTimeStamp = s.AddTimeStamp(oNodeSigValue.text);
    
    //Add the value returned from the timestamp service to the 
    //unsigned part of the signature block
    IXMLDOMNode oNodeObj = oNodeSig.selectSingleNode(".//*[local-name(.)='Object']");
    IXMLDOMNode oNode = oNodeObj.cloneNode(false);
    oNode.text = strVerifiedTimeStamp;
    oNodeObj.parentNode.appendChild(oNode);

    e.ReturnStatus = true;
}