次の方法で共有


Word 2002 文書のデジタル署名とデジタル署名情報のプログラムによる取得

Siew-Moi Khor
Microsoft Corporation

August 2002

対象 :
   MicrosoftR Office XP

MSDN Downloads から odc_wdds.exe をダウンロードする。

概要 : この資料では、Microsoft Word 2002 文書にデジタル署名を付加する方法と、 その文書からデジタル署名情報をプログラムで取得する方法について説明します。

目次

はじめに
Office SignatureSet コレクション
文書にデジタル署名する方法
   組み込み機能を使用した文書の署名
   プログラムによる文書の署名
   セキュリティ設定
   AddDigSig マクロの実行
文書のデジタル署名の詳細情報をプログラムで取得する方法
DigSigRetrieve マクロの実行
署名の有効性の検証
まとめ

はじめに

文書にデジタル署名を付加することには、多くの利点があります。 ファイルに付けられるデジタル署名は、 電子的な、暗号化を基礎とした、安全な認証スタンプです。 文書にデジタル署名が付加されていると、 そのファイルの真正性および完全性を証明できる検証可能な署名が提供されていることになります。 この署名の作成に使用された証明書によって、 署名者が識別されます。 文書の読者は、文書作成者およびこの文書が作成されてから改ざんされていないことを確認できます。

この資料では、Microsoft Word 2002 文書に Word の組み込みデジタル署名機能を使用して署名する方法と、 Microsoft Office の SignatureSet コレクションを使用してプログラムで署名する方法を説明しています。 署名されている文書のデジタル署名の詳細を確認する場合、 この詳細情報をプログラムで取得できます。 取得方法は、この資料で説明しています。

文書に署名するには、デジタル証明書が必要です。 この資料は、読者がデジタル証明書についての知識があることを前提にしています。 あまり詳しくない場合は、資料「What Are Digital Certificates?」にデジタル証明書に関する詳細が説明されています。 文書の署名に使用する有効な証明書は、 VeriSign などの認証機関 (CA) から購入できます。

Office SignatureSet コレクション

Microsoft Office の SignatureSet コレクション (図 1 参照) は、 Word 2002 の文書や Microsoft PowerPointR 2002 のプレゼンテーションのデジタル署名に対応する Signature オブジェクト (図 2 参照) のコレクションです。 ただし、このコレクションは Microsoft Excel 2002 には実装されていないことに注意してください。

この資料では、Word 2002 のみに注目しています。 Word 2002 の Signature オブジェクトは、 Document オブジェクトの SignatureSet コレクションに含まれています。 Word 2002 の SignatureSet オブジェクトをプログラムで取得するには、 Document オブジェクトの Signatures プロパティを使用します。

Aa140281.odc_wdds01(ja-jp,office.10).gif
図 1. Office SignatureSet コレクション

Aa140281.odc_wdds02(ja-jp,office.10).gif
図 2. Office Signature オブジェクト

この資料のダウンロードに含まれている AddDigSig.dot ファイルには、 Word 2002 文書にプログラムで署名するためのサンプル コードが含まれています。 RetrieveDigSigInfo.dot ファイルには、 Word 2002 の SignatureSet を使用して、 文書からデジタル署名情報をプログラムで取得するサンプル コードがあります。

文書にデジタル署名する方法

まず、Word 2002 組み込みの文書署名機能を使用して文書に署名をする方法を説明します。 その次に、プログラムによる署名方法を説明します。

組み込み機能を使用した文書の署名

  1. 署名する文書を開きます。

  2. [ツール] メニューの [オプション] をクリックして、[オプション] ダイアログ ボックスを表示します。

  3. [セキュリティ] タブをクリックします。

  4. [デジタル署名] ボタンをクリックします。

  5. [デジタル署名] ダイアログ ボックスで、[追加] をクリックします。 [証明書の選択] ダイアログボックスが表示されます (図 3 参照)。

    **注意   **デジタル署名を付加する文書をまだ保存していない場合は、 この時に保存をするように求められます。 文書を保存しないと、署名処理は続けられません。

    Aa140281.odc_wdds03(ja-jp,office.10).gif
    図 3. 署名に使う証明書の選択

  6. [OK] をクリックして、表示されている各ダイアログ ボックスを閉じます。

これで、この文書にデジタル署名されました。 署名されたことを確認するには、 文書ウィンドウの左上に表示される文書名を確認してください。 この名前の隣に "(署名済み)" と表示されます。

なお、文書の署名に複数のデジタル証明書を使用することもできます。 この場合は、手順 6 に進む前に、 使用するデジタル証明書の数だけ手順 5 を繰り返します。

プログラムによる文書の署名

SignatureSet コレクションの Add メソッドを使用して、 Signature オブジェクトを追加します。 SignatureSet コレクションへの変更を保存するには、 Commit メソッドを呼出す必要があることに注意してください。 また、SignatureSet コレクションから Signature オブジェクトを削除するには、 Signature オブジェクトの Delete メソッドを使用します。

AddDigSig.dot ファイルのサンプル コードでは、 次のコードにより、署名をアクティブ文書に追加しています。

Set sig = ActiveDocument.Signatures.Add

文書がまだ保存されていない場合は、 署名をする前に保存をするように求められます。 保存しないと、署名に使われるデジタル証明書を選択するためのダイアログ ボックス (上の図 3 ) が表示されません。

次のコードでは、新しい署名がコミットされる前に、 選択したデジタル証明書が期限切れでないことや、失効していないことなど、 基準を満たしていることを確認します。 もし、基準を満たしていない場合は、署名が文書から削除されます。

    If sig.IsCertificateExpired = False And _
        sig.IsCertificateRevoked = False Then
        bAddSig = True
    Else
        sig.Delete
        bAddSig = False
    End If

最後に、次のコードによって、署名がコミットされます。 Commit メソッドが実行されるまでは、 SignatureSet に加えられた変更は保存されません。

    ActiveDocument.Signatures.Commit

セキュリティ設定

署名されていない Microsoft Visual BasicR for Applications (VBA) マクロを実行する場合は、 [セキュリティ] ダイアログ ボックス ([ツール] メニューの [マクロ] をポイントし、[セキュリティ] を選択) でセキュリティ設定を [中] に設定し、 [組み込み済みのアドインとテンプレートをすべて信頼する] チェック ボックスをオンにする必要があります。 この設定は、テスト環境で作業する場合のみ使用するようにしてください。 テスト終了後は、セキュリティ レベルは [高] に戻してください。

**注意   ** セキュリティ レベルを [中] に設定し、[組み込み済みのアドインとテンプレートをすべて信頼する] チェック ボックスをオンにすると、 署名されていない COM アドインや VBA マクロを有効にするか無効にするかを確認するダイアログが表示され、 どちらかを選択できるようになります。 セキュリティ レベルを [高] に設定し、 [組み込み済みのアドインとテンプレートをすべて信頼する] チェック ボックスをオフにした場合は、 署名されていない COM アドインや VBA マクロはすべて確認しないで無効になります。 したがって、セキュリティ レベルを [高] に設定し、 [組み込み済みのアドインとテンプレートをすべて信頼する] チェック ボックスをオフにすることを強くお勧めします。

AddDigSig マクロの実行

AddDigSig.dot ファイルのマクロを実行するには、 AddDigSig.dot ファイルを次のディレクトリにコピーします。 これにより、Word を開いたときにマクロが読み込まれます。

ドライブ:\Program Files\Microsoft Office\Office10\Startup

このマクロをテストするには、 署名する Word 2002 文書を開きます。 次に、[ツール] メニューの [マクロ] をポイントし、[マクロ] をクリックします。 その結果、[マクロ] ダイアログ ボックス (図 4) が表示されます。 文書に署名するには、[AddDigSig] をクリックし、[実行] をクリックします。 文書の署名に使用するデジタル証明書を選択するためのダイアログ ボックスが表示されます。

Aa140281.odc_wdds04(ja-jp,office.10).gif
図 4. 実行するマクロの選択

文書のデジタル署名の詳細情報をプログラムで取得する方法

RetrieveDigSigInfo.dot ファイルには、 SignatureSet コレクションを使って、 文書のデジタル署名の詳細情報をプログラムで取得するためのサンプル コードが含まれています。 このコードを見てみましょう。

DigSigRetrieve 関数のコードでは、 まず最初に取得するデジタル署名情報を保持して表示するための表を作成し、 フォント、見出し、表題などを設定しています。 この部分のコードには、詳細なコメントが付けられているので、この資料では詳しい説明は省きます。 ここでは、代わりに、SignatureSet プロパティと Signature プロパティの使用方法を説明します。

最初に取得される情報は、 SignatureSet コレクションの Count プロパティによって返される、 文書に付加されている署名の数です。 たとえば、文書の署名に 2 つのデジタル証明書が使用されている場合は、この数は 2 になります。

iSigCount = ActiveDocument.Signatures.Count

以下のコードは、アクティブ文書に付加されている署名 1 つ 1 つを調べ、次の署名プロパティの詳細情報を取得しています。

  • AttachCertificate プロパティ ? 文書に指定されている Signature オブジェクトに対応するデジタル証明書がその文書に付加されているかどうかを示す Boolean 値を返します。
  • ExpireDate プロパティ ? デジタル証明書の有効期限を返します。
  • IsCertificateExpired プロパティ ? デジタル証明書の有効期限が切れていないかどうかを示す Boolean 値を返します。
  • IsCertificateRevoked プロパティ ? デジタル証明書が失効していないかどうかを示す Boolean 値を返します。
  • Issuer プロパティ ? デジタル証明書の発行者名を返します。
  • SignDate プロパティ ? 文書に署名された日付と時刻を返します。
  • Signer プロパティ ? 文書に署名をした署名者の名前を返します。
        Dim i As Integer
        For i = 1 To iSigCount
            .TypeText "Signature #" & i
            .MoveRight wdCell
            .TypeText "Is Certificate Attached?"
            .MoveRight wdCell
            .TypeText ActiveDocument.Signatures(i).AttachCertificate
            .MoveRight wdCell, 2
                         
            .TypeText "Expiry Date"
            .MoveRight wdCell
            .TypeText ActiveDocument.Signatures(i).ExpireDate
            MoveAndMerge 2
         
            .TypeText "Is Certificate Expired?"
            .MoveRight wdCell
            .TypeText ActiveDocument.Signatures(i).IsCertificateExpired
            MoveAndMerge 2
      
            .TypeText "Is Certificate Revoked?"
            .MoveRight wdCell
            .TypeText ActiveDocument.Signatures(i).IsCertificateRevoked
            MoveAndMerge 2
      
            .TypeText "Is Certificate Valid?"
            .MoveRight wdCell
            .TypeText ActiveDocument.Signatures(i).IsValid
            MoveAndMerge 2
      
            .TypeText "Issuer"
            .MoveRight wdCell
            .TypeText ActiveDocument.Signatures(i).Issuer
            MoveAndMerge 2
      
            .TypeText "Sign Date"
            .MoveRight wdCell
            .TypeText ActiveDocument.Signatures(i).SignDate
            MoveAndMerge 2
      
            .TypeText "Signer"
            .MoveRight wdCell
            .TypeText ActiveDocument.Signatures(i).Signer
            MoveAndMerge 1
        Next

このコードでは、 MoveAndMerge というサブルーチンも使われています。 このサブルーチンは、 移動するのは表のセル 1 つ分か 2 つ分か、 左へ移動するのか右へ移動するのかなど、 選択されている項目の移動方法についての処理を行います。 また、このコードには、エラー処理用のサブルーチンも使われています。 詳細なコメントが付けられているので、このコードはとても簡単に理解していただけるでしょう。

DigSigRetrieve マクロの実行

このマクロを実行する前に、 この資料の前半の「セキュリティ設定」の項目を参照し、 セキュリティ レベルが正しく設定されていることを確認してください。 RetrieveDigSigInfo.dot テンプレート内の DigSigRetrieve を実行するには、 RetrieveDigSigInfo.dot テンプレートを次のディレクトリにコピーします。 これにより、Word を開いたときにマクロが読み込まれます。

ドライブ:\Program Files\Microsoft Office\Office10\Startup

このマクロをテストするには、Word 2002 文書を開きます。

**注意   ** マクロを実行する文書は、誤って保存をしないよう、特に、誤って変更が加えられ、 そのためこの文書にデジタル署名が付加されている場合、その署名が無効になってしまうことがないように、 読み取り専用にすることをお勧めします。

マクロを実行するには、 [ツール] メニューの [マクロ] をポイントし、[マクロ] をクリックします。 [マクロ] ダイアログ ボックスが表示されます。[DigSigRetrieve] をクリックし、[実行] をクリックします。

マクロを実行した文書に署名されていない場合、取得した情報は図 5 のようになるでしょう。 文書に署名されていないので、Count プロパティの値が 0 になっています。

Aa140281.odc_wdds05(ja-jp,office.10).gif
図 5. 文書に署名されていない場合

マクロを実行した文書が 1 つのデジタル証明書を使用して署名されている場合、 取得した署名オブジェクト情報は図 6 のようになるでしょう。 このときの Count プロパティの値は 1 になります。 この例では、文書の署名にテスト用の証明書を使用しているので、証明書が有効ではありません。 したがって、IsValid プロパティを表す「Is Certificate Valid」の値が False になっています。

Aa140281.odc_wdds06(ja-jp,office.10).gif
図 6. 1つの証明書を使用して文書に署名されている場合

マクロを実行した文書に 2 つのデジタル証明書を使用して署名されている場合、 署名オブジェクト情報は図 7 のようになるでしょう。

Aa140281.odc_wdds07(ja-jp,office.10).gif
図 7. 2つの証明書を使用して文書に署名されている場合

署名の有効性の検証

プログラムで取得できた Signature オブジェクトの最も便利なプロパティの 1 つは、 IsValid プロパティです。 IsValid プロパティは、デジタル署名された文書の署名の有効性に関する情報を Boolean 値で返します。 署名が有効な場合、返される Boolean 値は True になります。 有効でない場合は False が返されます。

DigSigValid.dot テンプレートには、 この情報を取得するためのサンプル マクロが含まれています。 次のコードでは、文書に付加されている署名 1 つ 1 つを調べ、 各署名の署名者の名前と有効性を確認しています。

sSigValid = ""
    For Each objSignature In ActiveDocument.Signatures
        sSigValid = sSigValid + "Is Signature from " + _  
        objSignature.Signer + " Valid?  " + _
        Str$(objSignature.IsValid) + vbCrLf
    Next objSignature

次に、以下のコードにあるように、 新しく作成した文書に Signature オブジェクトの IsValid プロパティの Boolean 値を出力します。

Set docNew = Documents.Add
Selection.TypeText (sSigValid)

署名された文書が改ざんされていた場合、 この署名文書が改ざん後まだ保存されていなくても、IsValid プロパティは False を返すことに注意してください。 したがって、署名されている文書の署名の有効性を適切に検証するためには、 署名されている文書自体ではなく、新しく作成する文書に、この署名情報を出力するようにしてください。 また、文書の署名に使用したデジタル証明書が有効でない場合、 署名も無効になります。 このような場合、IsValid プロパティは False を返します。

DigSigValid マクロを実行する前に、 「セキュリティ設定」が正しく設定されていることを確認してください。 次に、DigSigValid.dot テンプレートを次のディレクトリにコピーします。 これにより、Word を開いたときにマクロが読み込まれます。

ドライブ:\Program Files\Microsoft Office\Office10\Startup

マクロを実行するには、まず署名された文書を開きます。 次に、[ツール] メニューの [マクロ] をポイントし、[マクロ] をクリックします。 [マクロ] ダイアログ ボックスが表示されます。[DigSigValid] をクリックし、[実行] をクリックします。

まとめ

SignatureSet を使用すると、 プログラムで文書にデジタル署名を追加できます。 また、例示したように、デジタル署名の詳細情報を取得して確認できます。 Office XP のセキュリティや、コード署名などの Office 関連のその他の署名に興味がある場合は、 次の資料に詳しい説明があります。