今回もIBM Notes/Domino 9.0.1 FP8関連の情報をお届けします。
その中でも、検証にはかなり手間がかかると思われる文書の暗号化/復号化について紹介します。
1.概要
元々、IBM Notes/Domino には、パブリックキーやシークレットキーを使って文書を暗号化する機能が含まれています。
前者はメール文書の暗号化や、Notes アプリケーションの文書を暗号化するのに利用できます。
後者はNotes アプリケーションの文書を暗号化するのに利用できます。

今回、シークレットキーによる文書の暗号化が、XPagesで行えるようになったという事で、ご紹介します。
なお、今回紹介する内容はIBM NotesクライアントおよびIBM Dominoサーバが必要になります。
2.事前準備
(1)IDボールトの作成
シークレットキーはNotes IDの中に格納されているので、この情報を利用するためにIDボールトを利用します。
したがって、あらかじめDominoサーバでIDボールトを利用できるようにしておく必要があります。
以下のURLリンクにある手順に従って、IDボールトを作成してください。
Notes ID ボールト
(2)IDボールトを利用するユーザを設定する
セキュリティポリシーを作成して、どのユーザがIDボールトを利用するのかを決めます。
手順は上記のリンクを参照してください。
3.暗号キーの作成と配布
(1)Notesクライアントで必要な分を作成してユーザに配布
IDボールトが作成できたら、文書を暗号化するために必要なシークレットキーを作成します。
次の手順でシークレットキーを作成します。
[ファイル][セキュリティ][ユーザーセキュリティ]メニューを開きます。

ユーザーセキュリティというダイアログが表示されるので、
[IBM Notes データ][文書]というタブを開きます。

[シークレットキーの作成]ボタンをクリックして、シークレットキーを作成します。
キー名やコメントは任意ですが、後で利用するときに分かるようにしておきましょう。

シークレットキーが作成できたら、このキーを共有したいユーザに配布するために[シークレットキーの送信]をクリックします。
これも、誰に配布したのかを忘れないように、どこかにメモしておきましょう。

配布をする際、宛先のユーザがそのキーを再配布できるようにするかどうかを決められますが、セキュリティの観念からすると基本的には再配布できないようにしておいた方が良いでしょう。
(2)自分のNotes IDに暗号キーをマージする
シークレットキーを送信されたユーザは、該当するメールを開きます。
[暗号キーの追加]を行ってくださいとかいてあるので、[アクション][暗号キーの追加]メニューウォリックします。

シークレットキーを受け入れるかどうか聞いてくるので、[追加]をクリックして受け入れます。

しばらくすると、シークレットキーを取り込んであるNotes IDがIDボールトに自動でアップロードされます。
4.文書を暗号化してみる
まずは、正しくシークレットキーで文書が暗号化できるかどうかを確かめます。
新規にNotes アプリケーションを作成します(テンプレートを使ったり既存のNotes アプリケーションを利用しても構いません)。
次にフォームを作成して、フィールドを作成します。
そのフィールドのプロパティにある「セキュリティオプション」は"このフィールドを暗号化する"にしておきます(すべてのフィールドである必要はありません)。

フォームを保存したら、このフォームで文書を作成します。
文書を保存したら、文書のプロパティを開いて、シークレットキーを設定します。

これでこの文書は設定したシークレットキーで暗号化されました。
5.文書の復号化を行う
(1)Notes アプリケーションの設定を行う
先ほど作成した、NotesアプリケーションをDomino Designerで開きます。
Xspプロパティを開いて、「Enable document encryption for this application」という項目にチェックを付けます。

[ソース]タブを開くと
xsp.domino.document.encryption=true
という行が追加されていればOKです。そのまま保存してください。
(2)XPageの画面を作成する
先ほど作成したフォームをXPage化します。
次にこのXPageを開く前の準備として、「dominoIDVaultBean」というオブジェクトに文書を開くことができる「ユーザ名」「ユーザのNotesパスワード」「IDボールトが格納されているサーバ名」を格納します。
使い方は、dominoIDVaultBean (Java - XPage 管理対象) を使用した Domino ID ボールトへのアクセス の記事を参照してください。
また、シークレットキーを持っていない等の理由により文書を復号化できなかったときのため、エラーメッセージを表示できるようにしておきます。
これは、「複数エラーメッセージコントロール」を配置しておくだけで良いです。

「dominoIDVaultBean」オブジェクトに値が正しく入っていれば、文書は復号化されます。
6.XPagesアプリを作成する
次に文書をXPagesで暗号化する方法についてです。
文書を暗号化するには下記の手順で行います。
(1)シークレットキーを取得するためのコントロールを配置する
シークレットキーの取得は、拡張ライブラリの中にある「Secret Key Picker」というコントロールを使用します。
この中のdataProviderというプロパティにsimpleSecretKeyPicker - secretKeyListという項目がありますが、
ここを
var svname = dominoIDVaultBean.getServerName();
var uname = dominoIDVaultBean.getUserName();
var pswd = dominoIDVaultBean.getUserPassword();
@UserSecretKeys( svname, pswd, uname );
に書き換えます。
※本来は「@UserSecretKeys();」だけで良いらしいのですが、動かなかったのでこのようにしています。
(2)文書を保存するロジックを作成する
シークレットキーを画面上で取得できたら、文書を保存します。
そのまま保存しても文書は暗号化されないので、以下のロジックで文書を保存するようにします。
- getUserIDメソッドを使用して、IDVault から特定ユーザーの UserID オブジェクトを取り出します。
- setEncryptionKeys メソッドを使用して、文書の暗号化に使用する鍵を指定します。
- encrypt メソッドを使用して、指定の暗号キーセットで文書を暗号化します。
シンプルにコード化するとこのような感じになります。
var docBackend:NotesDocument = document1.getDocument( true );
var svname = dominoIDVaultBean.getServerName();
var uname = dominoIDVaultBean.getUserName();
var pswd = dominoIDVaultBean.getUserPassword();
var userid:NotesUserID = idvault.getUserID( uname, pswd, svname );
var secKeys:java.util.Vector = new java.util.Vector();
var secKey = "画面上で選択した暗号キー";
secKeys.addElement( secKey );
docBackend.setEncryptionKeys( secKeys );
docBackend.encrypt( userid );
docBackend.save( true, true, true );
これで指定したシークレットキーで文書を暗号化できるようになります。
暗号化した文書はNotesクライアントでもXPagesでも復号化ができます。
7.まとめ
いかがでしょうか。IDボールトの機能を利用することで、XPagesのようなWebアプリケーションでもIBM Notes/Dominoの機能を活かすことができるようになります。
今回の暗号化については、IBM Champions for ICSの御代氏が詳しくブログにまとめているのでそちらを参照していただくと、より理解が深まると思います。
IDボールトによる文書の暗号化(2)
IDボールトによる文書の暗号化(3)
IDボールトによる文書の暗号化(4)