デジタル署名を操作するWork with Digital Signatures?

Microsoft.Office.InfoPath 名前空間のオブジェクト モデルには、プログラムによってデジタル署名を操作する機能が用意されています。The object model of the Microsoft.Office.InfoPath namespace provides features for working with digital signatures programmatically.

デジタル署名の機能Digital Signature Features

InfoPath のデジタル署名機能を使用すると、以下の操作を行うことができます。The digital signatures features provided by InfoPath enable you to:

  • フォーム全体に署名する、またはフォーム内の署名可能な特定のデータ セットに個別に署名する。Enable signatures for the entire form, or for specific sets of data in the form that can be signed separately.

  • 署名対象にできる各データ セットについて、単一の署名または複数の署名が可能かどうかを指定し、その署名間の関係を指定する。たとえば、それらの署名を同等の連署にするのか、それとも新しい各署名を以前のすべての署名の副署にするのかを指定できます。Specify, for each set of data that can be signed, whether a single signature or multiple signatures are allowed and what their relationship will be. For example, you can specify whether they are parallel co-signatures or whether each new signature countersigns all the earlier signatures.

  • ユーザーがフォームに署名したときにフォームに表示されるメッセージを指定する。Specify a message to be shown to form users as they sign the form.

  • 文書に署名を挿入し、それを確認する。Insert and see a signature in the document.

  • セキュリティ向上のために各署名に追加された検証可能な非否認情報を確認する。この追加情報には、各署名者に表示されたフォームのビューが含まれています。この追加情報は署名の一部になっていて、署名を無効にすることなく削除することはできません。このデータは、フォーム内の署名をクリックして [ デジタル署名の確認] ダイアログ ボックスを表示することにより、いつでも再表示できます。View verifiable non-repudiation information that has been added to each signature for increased security. This additional information, which includes a view of the form as it was presented to each signer, is part of the signature and cannot be removed without invalidating the signature. At any time, you can recall this data by clicking on the signature in the form to display the Verify Digital Signature dialog box.

  • デジタル署名の操作にオブジェクト モデルを活用する。デジタル署名のオブジェクト モデルを通じて、署名ブロックにカスタム情報を完全に信頼できる形で追加できます。Take advantage of an object model for working with digital signatures. Add custom information to the signature block in fully trusted forms through the digital signature object model.

デジタル署名のオブジェクト モデルの概要Overview of the Digital Signatures Object Model

Sign イベントThe Sign Event

デジタル署名のオブジェクト モデルには、次のイベントがあります。The object model for digital signatures provides the following event.

名前Name 説明Description
SignSign
署名するための一連のデータが選択されたときに発生します。Occurs after a set of data has been selected to sign.
このイベントを使用すると、デジタル署名に格納されているデータを操作することができます。たとえば、信頼されるタイムスタンプ サーバーからデータを追加したり、トランザクションのサーバー側副署名を追加したりできます。また、このイベントを使用すると、現在のユーザーが特定のグループのメンバーでない場合に署名を拒否することもできます。You can use this event to manipulate the data stored within the digital signature. For example, you can add data from a trusted timestamp server, or add a server-side countersignature of the transaction. You can also use this event to block signing if the current user is not a member of a particular group.

SignEventArgs オブジェクトThe SignEventArgs Object

Sign イベントのイベント ハンドラーは、 SignEventArgs イベント オブジェクトで動作します。このイベント オブジェクトには、次のプロパティがあります。An event handler for the Sign event can work with the SignEventArgs event object, which provides the following properties.

名前Name 説明Description
SignedDataBlockSignedDataBlock
Sign イベントを発生させたデータのセットを取得します。Gets the set of data that raised the Sign event.
SignatureWizardSignatureWizard
[ デジタル署名] ダイアログ ボックスを表示するかどうかを取得または設定します。Gets or sets whether to display the Digital Signatures dialog box.

注意

InfoPath 2003 に付属している Microsoft.Office.Interop.InfoPath.SemiTrust マネージ コード オブジェクト モデルで、 OnSign イベントの SignEvent イベント オブジェクトには、イベントに関連付けられているフォームの XDocument オブジェクトにアクセスするための XDocument プロパティがあります。このプロパティは、InfoPath Forms Services または InfoPath で Microsoft.Office.InfoPath オブジェクト モデルを使用して作成されたフォーム テンプレートでは必要ありません。 XmlForm クラスのオブジェクト モデル メンバーは、フォーム コード内で this (C# の場合) キーワードまたは Me (Visual Basic の場合) キーワードを使用してアクセスできるからです。たとえば、 XmlForm クラスの Signed プロパティにアクセスして、フォームが署名されているかどうかを判別するには、 this.Signed または Me.Signed. を入力できます。In the Microsoft.Office.Interop.InfoPath.SemiTrust managed code object model that shipped with InfoPath 2003, the SignEvent event object for the OnSign event provides an XDocument property for accessing the XDocument object of the form associated with the event. This is not necessary with form templates created with InfoPath Forms Services or InfoPath using the Microsoft.Office.InfoPath object model because the object model members of the XmlForm class can be accessed in form code using the this (C#) or Me (Visual Basic) keyword. For example, to access the Signed property of the XmlForm class to determine if a form is signed, you can type either this.Signed or Me.Signed.

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

デジタル署名のオブジェクト モデルには、次のコレクションがあります。The object model for digital signatures provides the following collections.

名前Name 説明Description
SignedDataBlockCollectionSignedDataBlockCollection
InfoPath のデザイン モードでデザイン時に定義されたフォーム テンプレート内の SignedDataBlock オブジェクトのコレクション。The collection of the SignedDataBlock objects in the form template as defined at design time in InfoPath design mode.
SignedDataBlockCollection コレクションは、フォームに関連付けられている SignedDataBlock オブジェクトへのアクセスに使用できるプロパティを実装しています。フォームに関連付けられている SignedDataBlockCollection オブジェクトは、 XmlForm クラスの SignedDataBlocks プロパティを使用してアクセスできます。 The SignedDataBlockCollection collection implements properties that can be used to access the SignedDataBlock objects associated with a form. The SignedDataBlockCollection object associated with a form is accessible through the SignedDataBlocks property of the XmlForm class.
SignatureCollectionSignatureCollection
フォーム内の各 SignedDataBlock オブジェクトの Signature オブジェクトのコレクションが格納されています。Contains a collection of Signature objects for each SignedDataBlock object in the form.
SignatureCollection クラスには、フォームに関連付けられている Signature オブジェクトへのアクセスや、署名の作成に使用できるプロパティとメソッドが実装されています。 SignedDataBlock に関連付けられている SignatureCollection オブジェクトは、 Signatures プロパティを使用してアクセスできます。 The SignatureCollection class implements properties and a method that can be used to access a form's associated Signature objects and to create a signature. The SignatureCollection object associated with a SignedDataBlock is accessible using the Signatures property.
SignatureCollection クラスの CreateSignature メソッドを使用するときは、 Signature オブジェクトに対して Sign メソッドを呼び出すまでは署名が書き込まれないことを覚えておいてください。これらのメソッドは、完全に信頼されたフォーム テンプレートの Sign イベント ハンドラーからしか呼び出せません。 When you use the CreateSignature method of the SignatureCollection class, keep in mind that the signature is not written until the Sign method is called on the Signature object. These methods can be called only from the Sign event handler of a fully trusted form template.

デジタル署名のオブジェクト モデルには、次のオブジェクトがあります。The object model for digital signatures provides the following objects.

名前Name 説明Description
SignedDataBlockSignedDataBlock
フォーム内の署名可能な一連のデータを表します。SignedDataBlock オブジェクトには、署名可能なデータ セットをプログラムで操作するために使用できる多数のプロパティと 1 つのメソッドがあります。Represents a set of signable data in a form. The SignedDataBlock object provides a number of properties and one method that can be used to programmatically interact with a set of signable data.
SignatureSignature
フォームまたはフォーム内の署名可能な一連のデータに追加されたデジタル署名を表します。Signature オブジェクトには、デジタル署名に関する情報の取得に使用できる各プロパティ、および XML デジタル署名ブロックの書き込みとその暗号化ハッシュ値の計算のための Sign メソッドが実装されています。Represents a digital signature that has been added to a form or set of signable data in a form. The Signature object implements properties that can be used to retrieve information about the digital signature, and the Sign method for writing the XML digital signature block and computing its cryptographic hash value.
CertificateCertificate
署名の作成に使用された X.509 デジタル証明書を表します。Represents the X.509 digital certificate that has been used to create the signature.

プログラムでデジタル署名を操作するWorking with Digital Signatures Programmatically

Microsoft.Office.InfoPath 名前空間のオブジェクト モデルには、デジタル署名をプログラムによって操作するためのメンバーが用意されています。特に、完全に信頼されたフォームでは、次のようなタイムラインに従って、署名ブロックをコミットする前に署名ブロックにカスタム情報を追加することができます。The object model of the Microsoft.Office.InfoPath namespace provides members for interacting with digital signatures programmatically. In particular, fully-trusted forms can add custom information to the signature block before it is committed, according to the following timeline:

  1. ユーザーがフォームにデジタル署名を追加する操作を開始します。User chooses to add a digital signature to a form.

  2. [ デジタル署名] ダイアログ ボックスが表示され、ユーザーは [ 追加] をクリックし、署名するデータを選択します。The Digital Signatures dialog box is displayed, the user clicks Add, and then selects the data to sign.

  3. SignedDataBlock オブジェクトによって表されている選択されたデータの Sign イベントが発生し、 SignedDataBlock オブジェクトの Sign() メソッドおよび SignatureCollection コレクションの CreateSignature メソッドが実行されます。The Sign event for the selected data represented by the SignedDataBlock object is raised, and the Sign() method of SignedDataBlock object and the CreateSignature method of the SignatureCollection collection are executed.

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

  5. Signature オブジェクトの Sign() メソッドが実行されます。The Sign() method of the Signature object is executed.

  6. 名前の入力 (または署名画像の選択)、署名に使用する証明書の選択、およびコメントの入力を行うための [ 署名] ダイアログ ボックスが表示されます。The Sign dialog box is displayed for typing a name (or selecting a signature image), selecting a certificate to sign with, and to enter comments.

  7. [ 署名] ボタンがクリックされると、そのフォーム用の署名のコレクションに署名が追加され、非否認情報がキャプチャされて署名と共に保存されます (非否認情報は、後で [ デジタル署名] ダイアログ ボックスの [ 署名済みフォームの表示] をクリックし、[ 収集された追加署名情報の表示] をクリックすることで確認できます)。When the Sign button is clicked, the signature is added to the collection of signatures for the form and the non-repudiation information is captured and saved with the signature (which can be viewed later by clicking View Signed Form on the Digital Signatures dialog box, and then clicking See the additional signing information that was collected).

次の例では、ユーザーが、選択されたデータの署名と、信頼できるタイムスタンプ サービスから取得したタイムスタンプ値で副署の署名を行うとき、Sign() メソッドを呼び出します。The following example invokes the Sign() method when the user signs the selected data and countersigns the signature with a timestamp value retrieved from a trusted timestamp service.

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