Microsoft.Office.InfoPath 名前空間のオブジェクト モデルには、プログラムによってデジタル署名を操作する機能が用意されています。
デジタル署名の機能
InfoPath のデジタル署名機能を使用すると、以下の操作を行うことができます。
フォーム全体に署名する、またはフォーム内の署名可能な特定のデータ セットに個別に署名する。
署名対象にできる各データ セットについて、単一の署名または複数の署名が可能かどうかを指定し、その署名間の関係を指定する。 たとえば、それらの署名を同等の連署にするのか、それとも新しい各署名を以前のすべての署名の副署にするのかを指定できます。
ユーザーがフォームに署名したときにフォームに表示されるメッセージを指定する。
文書に署名を挿入し、それを確認する。
セキュリティを強化するために、各署名に追加された検証可能な否認不可の情報を表示します。 各署名者に提示されたフォームのビューを含むこの追加情報は、署名の一部であり、署名を無効にしないと削除できません。 フォーム内の署名をクリックして [デジタル署名の 確認 ] ダイアログ ボックスを表示することで、いつでもこのデータを思い出すことができます。
デジタル署名の操作にオブジェクト モデルを活用する。 デジタル署名のオブジェクト モデルを通じて、署名ブロックにカスタム情報を完全に信頼できる形で追加できます。
デジタル署名のオブジェクト モデルの概要
Sign イベント
デジタル署名のオブジェクト モデルには、次のイベントがあります。
名前 | 説明 |
---|---|
Sign |
署名するための一連のデータが選択されたときに発生します。 このイベントを使用すると、デジタル署名に格納されているデータを操作することができます。 たとえば、信頼されるタイムスタンプ サーバーからデータを追加したり、トランザクションのサーバー側副署名を追加したりできます。 また、このイベントを使用すると、現在のユーザーが特定のグループのメンバーでない場合に署名を拒否することもできます。 |
SignEventArgs オブジェクト
Sign イベントのイベント ハンドラーは、 SignEventArgs イベント オブジェクトで動作します。このイベント オブジェクトには、次のプロパティがあります。
名前 | 説明 |
---|---|
SignedDataBlock |
Sign イベントを発生させたデータのセットを取得します。 |
SignatureWizard |
[ デジタル署名] ダイアログ ボックスを表示するかどうかを取得または設定します。 |
注:
InfoPath 2003 に付属する Microsoft.Office.Interop.InfoPath.SemiTrust マネージ コード オブジェクト モデルでは、OnSign イベントの SignEvent イベント オブジェクトは、イベントに関連付けられたフォームの XDocument オブジェクトにアクセスするための XDocument プロパティを提供します。 これは、Microsoft.Office.InfoPath オブジェクト モデルを使用してInfoPath Forms Servicesまたは InfoPath を使用して作成されたフォーム テンプレートでは必要ありません。これは、この (C#) または Me (Visual Basic) キーワード (keyword)を使用して、XmlForm クラスのオブジェクト モデル メンバーにフォーム コードでアクセスできるためです。 たとえば、XmlForm クラスの Signed プロパティにアクセスしてフォームが署名されているかどうかを判断するには、または を入力this.Signed
できます。Me.Signed.
コレクションおよびオブジェクト
デジタル署名のオブジェクト モデルには、次のコレクションがあります。
名前 | 説明 |
---|---|
SignedDataBlockCollection |
InfoPath のデザイン モードでデザイン時に定義されたフォーム テンプレート内の SignedDataBlock オブジェクトのコレクション。 SignedDataBlockCollection コレクションは、フォームに関連付けられている SignedDataBlock オブジェクトへのアクセスに使用できるプロパティを実装しています。 フォームに関連付けられている SignedDataBlockCollection オブジェクトは、 XmlForm クラスの SignedDataBlocks プロパティを使用してアクセスできます。 |
SignatureCollection |
フォーム内の各 SignedDataBlock オブジェクトの Signature オブジェクトのコレクションが格納されています。 SignatureCollection クラスには、フォームに関連付けられている Signature オブジェクトへのアクセスや、署名の作成に使用できるプロパティとメソッドが実装されています。 SignedDataBlock に関連付けられている SignatureCollection オブジェクトは、 Signatures プロパティを使用してアクセスできます。 SignatureCollection クラスの CreateSignature メソッドを使用するときは、 Signature オブジェクトに対して Sign メソッドを呼び出すまでは署名が書き込まれないことを覚えておいてください。 これらのメソッドは、完全に信頼されたフォーム テンプレートの Sign イベント ハンドラーからしか呼び出せません。 |
デジタル署名のオブジェクト モデルには、次のオブジェクトがあります。
名前 | 説明 |
---|---|
SignedDataBlock |
フォーム内の署名可能な一連のデータを表します。 SignedDataBlock オブジェクトには、署名可能なデータ セットをプログラムで操作するために使用できる多数のプロパティと 1 つのメソッドがあります。 |
Signature |
フォームまたはフォーム内の署名可能な一連のデータに追加されたデジタル署名を表します。 Signature オブジェクトは、デジタル署名に関する情報を取得するために使用できるプロパティと、XML デジタル署名ブロックを記述してその暗号化ハッシュ値を計算するための Sign メソッドを実装します。 |
Certificate |
署名の作成に使用された X.509 デジタル証明書を表します。 |
プログラムでデジタル署名を操作する
Microsoft.Office.InfoPath 名前空間のオブジェクト モデルには、デジタル署名をプログラムによって操作するためのメンバーが用意されています。 特に、完全に信頼されたフォームでは、次のようなタイムラインに従って、署名ブロックをコミットする前に署名ブロックにカスタム情報を追加することができます。
ユーザーがフォームにデジタル署名を追加する操作を開始します。
[ デジタル署名] ダイアログ ボックスが表示され、ユーザーは [ 追加] をクリックし、署名するデータを選択します。
SignedDataBlock オブジェクトによって表されている選択されたデータの Sign イベントが発生し、 SignedDataBlock オブジェクトの Sign() メソッドおよび SignatureCollection コレクションの CreateSignature メソッドが実行されます。
任意のオプション カスタム操作が実行されます。
名前の入力 (または署名画像の選択)、署名に使用する証明書の選択、およびコメントの入力を行うための [ 署名] ダイアログ ボックスが表示されます。
[ 署名] ボタンがクリックされると、そのフォーム用の署名のコレクションに署名が追加され、非否認情報がキャプチャされて署名と共に保存されます (非否認情報は、後で [ デジタル署名] ダイアログ ボックスの [ 署名済みフォームの表示] をクリックし、[ 収集された追加署名情報の表示] をクリックすることで確認できます)。
次の例では、ユーザーが、選択されたデータの署名と、信頼できるタイムスタンプ サービスから取得したタイムスタンプ値で副署の署名を行うとき、Sign() メソッドを呼び出します。
public void FormEvents_Sign(object sender, SignEventArgs e)
{
// Add a new Signature object to the SignedDataBlockCollection.
Signature thisSignature =
e.SignedDataBlock.Signatures.CreateSignature();
// Write the XML digital signature block and compute hash
// for signed data.
thisSignature.Sign();
// Countersign the signature with a trusted timestamp.
// Get the XML node storing the signature block.
XPathNavigator oNodeSig = thisSignature.SignatureBlockXmlNode;
XPathNavigator oNodeSigValue =
oNodeSig.SelectSingleNode(
".//*[local-name(.)='signatureValue']");
// Get timestamp from a trusted timestamp service (fictitious).
MyTrustedTimeStampService s = new MyTrustedTimeStampService();
string strVerifiedTimeStamp = s.AddTimeStamp(oNodeSigValue.Value);
// Add the value returned from the timestamp service to the
// unsigned part of the signature block.
XPathNavigator oNodeObj =
oNodeSig.SelectSingleNode(".//*[local-name(.)='Object']");
XPathNavigator oNode = oNodeObj.Clone();
oNode.SetValue(strVerifiedTimeStamp);
oNodeObj.MoveToParent();
oNodeObj.AppendChild(oNode);
e.SignatureWizard = false;
}
Public Sub FormEvents_Sign(ByVal sender As Object, _
ByVal e As SignEventArgs)
' Add a new Signature object to the SignedDataBlockCollection.
Dim thisSignature As Signature =
e.SignedDataBlock.Signatures.CreateSignature
' Write the XML digital signature block and compute hash
' for signed data.
thisSignature.Sign()
' Countersign the signature with a trusted timestamp.
' Get the XML node storing the signature block
Dim oNodeSig As XPathNavigator = _
thisSignature.SignatureBlockXmlNode
Dim oNodeSigValue As XPathNavigator = _
oNodeSig.SelectSingleNode(_
".//*[local-name(.)='signatureValue']")
' Get timestamp from a trusted timestamp service (fictitious).
Dim s As MyTrustedTimeStampService = New MyTrustedTimeStampService()
Dim strVerifiedTimeStamp As String = _
s.AddTimeStamp(oNodeSigValue.Value)
' Add the value returned from the timestamp service to the
' unsigned part of the signature block.
Dim oNodeObj As XPathNavigator =
oNodeSig.SelectSingleNode(".//*[local-name(.)='Object']")
Dim oNode As XPathNavigator = oNodeObj.Clone()
oNode.SetValue(strVerifiedTimeStamp)
oNodeObj.MoveToParent()
oNodeObj.AppendChild(oNode)
e.SignatureWizard = False