2010/11/24

CouchDB: Prismを使ってSSLクライアント認証専用のブラウザを作ってみた

Prism 1.0b4を使って、SSLクライアント認証を有効にしてCouchDB専用のブラウザを作成してみました。

まずSSLクライアント認証を有効にするために、newcert.pemとnewkey.pemの内容をPrismに取り込む必要があります。

newkeym.pemの内容を取り込むために、PKCS12形式に変換します。 そこでいつも使っているPEM形式からPKCS12形式のファイルを作成するところから作業を始めます。

またFirefoxでも同じ方法でクライアント認証を有効にできます。 しかし普段使っているFirefoxに自己認証CA局のcacert.pem等を登録したくなかったため、プロファイルが独立しているPrismを利用しています。

プロファイルを新たに作成したFirefox環境でも同じ事はできるはずですが、プロファイルの選択は扱いずらいところもPrismを選択した理由です。

作業環境

いつもどおりUbuntu 10.04 LTS amd64上で作業を行ないます。 試していませんが、ディレクトリへのパスが違うところをカバーすれば、他のプラットフォームでも問題なく動くでしょう。

またいくつかのファイルは次の場所以下にあるとしています。 適当に読み替えてください。

  • prism-1.0b4の展開先: ~/work/prism-1.0b4/
  • demoCAディレクトリ: ~/lib/demoCA/

PKCS12形式のファイルを準備する

この作業は以前に作成したstunnelに接続するためのPEM形式のファイルが手元にあるところから始めます。

カレントディレクトリにnewcert.pemとnewkey.pemの2つのファイルがあるとします。

$ ls -l newcert.pem newkey.pem
-rw-r--r-- 1 user1 user1 3494 2010-11-15 15:05 newcert.pem
-rw-r--r-- 1 user1 user1  951 2010-11-15 15:04 newkey.pem

newcert.pemファイルの先頭はテキストの説明文が入っています。

Certificate:
    Data:
        Version: 3 (0x2)
...
-----BEGIN CERTIFICATE-----
MIIDWjCCAsOgAwIBAgIJANXx3xE0zyuGMA0GCSqGSIb3DQEBBQUAMIGWMQswCQYD
...
-----END CERTIFICATE-----

newkey.pemファイルの先頭はこんな感じです。

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,8EE3D06ADB9C1FD9

gvHfg80xquvNmLpmajEU9DwEoxOHk+TwaNQQqEqfVorciDO3KdLGdwSbKshowhGi
QjiWBeHC9fOuzHhUfj5pPCuEvO7ImoKaOgia9Zj9IiEg37t4J8Rl2bjxpcdN73HB
...
-----END RSA PRIVATE KEY-----

このファイルからPKCS12形式のファイルを生成します。 とりあえずファイル名は newcertkeys.p12としておきます。

コマンドラインは次のようになってCA局のcacert.pemに"../demoCA/cacert.pem"でアクセスしています。 "name"は何でも良いのですが、証明書のCommonName (CN)と同じにしておきます。 ここら辺は環境に合わせて変更してください。

クライアント証明書のCNをemail addressにするのは良くある使い方の一つだと思います。

$ cd ~/lib/demoCA.couchdb_stunnel_client_key
$ openssl pkcs12 -in newcert.pem -inkey newkey.pem -certfile ../demoCA/cacert.pem -out newcertkeys.p12 -export -name "user1@example.org"
Enter pass phrase for newkey.pem:  udfa93a
Enter Export Password:  re89efkjsadf
Verifying - Enter Export Password:  re89efkjsadf

最初に入力するのはnewreq.pemを作成する段階で入力したパスフレーズで、次に入力する"Enter Export Password"の部分は今回新たに決めるところです。

ひとまずファイルを生成したので、Prismに移ります。

Prism 1.0b4を使ってStunnelに接続するWebブラウザを生成する

PrismはMozilla Labsが開発している、任意のWebアプリケーション用のWebブラウザを生成するアプリケーションです。

Prismの特徴

デフォルトでは、このWebブラウザにはメニューバーやロケーションバーやブックマークバーといった、不特定多数のWebサイトを閲覧するための便利な機能はありません。

Prismは、Firefoxによく似た、しかし機能が制限されたWebブラウザを作り出します。

Prism自身はWebブラウザではなく、起動するとURLの入力を求め、PrismはそのURLを開くWebブラウザが起動するよう、デスクトップにショートカットやらスクリプトファイルを作成します。

つまりPrismを使う事でTwitter Webインタフェースの専用クライアントや、Eijiroを検索するための専用クライアントを準備することができます。

この利点はFirefoxでいうところのプロファイルをURL毎に作成し、さらにプロセスを独立させ、互いの干渉を避けるところにあります。

PrismにSSLクライアント認証用のURLを登録する

1.0b4を展開したディレクトリに移動し、prismを起動します。

$ cd prism-1.0b4
$ ./prism

ここで入力した内容は次のとおりです。

  • URL: https://home.example.org:5984/_utils/
  • Name: CouchDB_home
  • Show navigation bar: チェック
  • Show status messages and progress: チェック
  • Enable navigation keys: チェック
  • Desktop: チェック
  • Icon: 指定なし

この作業の中でPrismとそこから起動したWebブラウザは"https://home.example.org:5984/_utils/"に接続しようとしますが、まだクライアント認証ができないためエラーになります。

途中でポップアップが表示されたらCancelするなどしてやりすごして入力します。

URLの注意事項

ここで入力するURLを https://home.example.org:5984/_utils と最後の'/'を取ってしまうと、SSLではなくhttpで接続させるリダイレクトに失敗してエラー画面になってしまうので注意してください。

作業ディレクトリへの移動

PrismでSSLの証明書関連の作業をするためには、プロファイルディレクトリに移動します。

Prismによって作成されるディレクトリは2つあります。 サブディレクトリ名は最初に登録した名前(Name:)を小文字にして空白や起動を'_'に変換した名前を使っています。

  • ~/.prism/couchdb_home/ - プロファイルやFirefox的なファイルが配置される
  • ~/.webapp/couchdb_home@prism.app/ - 最初に開くURL等が記述された設定ファイル、Icon用PNGファイルの格納先

今回は~/.prism/以下のディレクトリで作業をします。 適当な名前のプロファイル用ディレクトリを探して、その中に移動しています。

$ cd ~/.prism/couchdb_home
$ ls
55good1m.default  profiles.ini
$ cd 55good1m.default
$ ls 
Cache      compatibility.ini  extensions        localstore.json  permissions.sqlite     pluginreg.dat
XPC.mfasl  compreg.dat        extensions.cache  localstore.rdf   places.sqlite          prefs.js
XUL.mfasl  cookies.sqlite     extensions.ini    mimeTypes.rdf    places.sqlite-journal  xpti.dat

作業をすると、このディレクトリにkey3.dbやcert8.dbの名前でファイルが作成されていきます。

作業に使うcertutilコマンドの説明は「 Using the Certificate Database Tool」にあります。

opensslコマンドと似たような事をしますが、その背景や概要についてはSSL Referenceの「Chapter 2. Getting Started With SSL」にあります。

自己認証CA局のcacert.pemを登録する

まずはクライアント認証の前にstunnelが使用するstunnel.pemを検証するため、対応するcacert.pemを登録します。

$ ~/work/prism-1.0b4/xulrunner/certutil -A -n demoCA.example.org -t "Cu" -d . -i ~/lib/demoCA/cacert.pem

内容を確認する場合には次の要領で行ないます。

$ ~/work/prism-1.0b4/xulrunner/certutil -L -d .
Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

demoCA.example.org                                           C,,  
クライアント証明書の登録

続いてクライアント証明書を登録します。 ここではPKCS12形式に変換したファイルを利用します。

$  ~/work/prism-1.0b4/xulrunner/pk12util -d . -i ~/lib/demoCA.couchdb_stunnel_client_keys/newcertkeys.p12 

keyファイルの内容を保護するためにパスワードを聞かれるので、適当に決めます。

最後にnewcertkeys.p12ファイルを開くためのパスワードを入力するので、先ほど決めたパスフレーズを入力します。

Enter a password which will be used to encrypt your keys.
The password should be at least 8 characters long,
and should contain at least one non-alphabetic character.

Enter new password:   eu938lakj
Re-enter password:   eu938lakj
Enter password for PKCS12 file:   re89efkjsadf
pk12util: PKCS12 IMPORT SUCCESSFUL

作業が終ったら先ほどと同じように登録された鍵ファイルの情報を確認しておきます。

$ ~/work/prism-1.0b4/xulrunner/certutil -L -d .
Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

demoCA.example.org                                           C,,  
user1@example.org                                            u,u,u

ここで u,u,uとなっているのが、keyファイルが読み込まれたことを示しています。

このままではcertファイルがまだ組み込まれていないので、それを読み込みましょう。

$ ~/work/prism-1.0b4/xulrunner/certutil -A -n "user1@example.org" -t "T,," -d . -i ~/lib/demoCA.couchdb_stunnel_client_keys/newcert.pem

内容を確認して、 Tu,u,uと先頭にTが付いたことを確認しておきます。

$ ~/work/prism-1.0b4/xulrunner/certutil -L -d .
Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

demoCA.example.org                                           C,,  
user1@example.org                                            Tu,u,u

クライアントの起動

この起動方法はいろいろですが、Linuxの場合はデスクトップにあるショートカットの内容を元にコマンドラインから起動することも簡単にできます。

$ "/home/user1/work/prism-1.0b4/prism" -override "/home/user1/.webapps/couchdb_home@prism.app/override.ini" -webapp couchdb_home@prism.app

起動時に送信するクライアント認証のために送信する証明書を選択するダイアログが表示されます。

Webブラウザ起動時に表示されるダイアログ

選択した証明書に対応するKeyはパスワードで保護されているため、PKCS12ファイルをインポートする時に入力したパスワード( eu938lakj)を入力します。

keyにアクセスする為のパスワード入力ダイアログ

最後にBasic認証用のパスワード入力ダイアログが表示されて、CouchDBのWebイタンフェース(futon)に接続できれば完了です。

Prismを起動しても表示が正しく行なわれない

ここまででPrismの準備は終っていますが、このままBasic認証を有効にしたCouchDBにアクセスすると、SSLの有無に関わらず、DBやDocumentのリストが表示されません。

Basic認証を使っていないと気がつかないかもしれませんが、これはPrismで使用しているJavaScript Engineの挙動によるものです。

Error Consoleを開くとfuton.jsの中でwindow.nameがJSON.parse()で処理できない値を返していることが問題だという事がわかります。

Error Consoleに表示されたwindow.name関連のメッセージ

これは 既に報告されていて、 パッチ(ouchdb-896.patch)が提供されています。

簡単なパッチなので手で当てて終りましたが、Webブラウザ側ではJavaScriptがCacheされているとなかなか再読み込みされないかもしれません。

JavaScriptを更新する場合はプロファイルの下にあるCacheディレクトリを削除します。 今回の場合は、~/.prism/couchdb_home/55good1m.default/Cache を削除して解決しました。

さいごに

ネタはCouchDBとStunnelでしたが、Firefox系のSSLクライアント認証の方法としてはごくごく普通のことをしたと思います。

Prismは便利なんですけれど、自分でショートカットを削除しても復活できるところが、場合によっては便利だったり、問題だったりしそうです。

その点ではPrismのProfile Managerは役に立たないので、管理用のユーティリティを作ってみてもいいのかもしれません。

0 件のコメント: