失効リスト (CRL) が機能するためには、証明書に CRL Distribution Points が記載されていなければならないらしい。これは、失効リストの配布元を示す情報で、OpenSSL では openssl.cnf に crlDistributionPoints の設定をすることで、発行される証明書に CRL Distribution Points の情報が埋め込まれる。
問題はどこに記述するかだが……。とりあえず、[usr_cert] セクションにでも書いておくことにしよう。
(略)
[ user_cert ]
(略)
crlDistributionPoints = URI:http://www.uconst.org/CA/uconst-ca.crl
(略)
URI: の後に、crl のファイルを配布する URL を記述する。結果は次の通り。
$ ./CA.sh -sign
$ openssl x509 -noout -text -in newcert.pem
Certificate:
(略)
X509v3 extensions:
(略)
X509v3 CRL Distribution Points:
Full Name:
URI:http://www.uconst.org/CA/uconst-ca.crl
(略)
それで、失効リストを公開して、失効した証明書をサーバに設定して Firefox 3.6.3 で接続すると、普段と変りない。 Internet Exploler 6 (IE6) だと、「このサイトのセキュリティ証明書の取り消し情報は、使用できません。続行しますか?」などとでてくる。少なくとも IE6 では途中まではうまく行ってるようだ。
IE6 は、CRL の署名がオレオレ認証局になっているのが気に入らないらしい。オレオレ認証局の証明書をルート証明書のリストに追加してやると、「このサイトのセキュリティ証明書は、取り消されています。このサイトは信頼するべきではありません。」と出てくる。これがまさに期待通りの挙動だ。
とはいえ、オレオレ認証局の証明書をインストールするのは、はばかられるので、IE6 で CRL の動作が確認できたという結論をもって、インストールしたオレオレ認証局証明書をアンインストールした。
Firefox 3.6 では、どうするのだろう? 調べてみると、Online Certificate Status Protocol(OCSP)
というものを使うらしい。openssl ocsp で、OCSP のサーバを動かすことができるようだけれど、ど、実際動かしてみたらエラーが出た。エラーメッセージからはソケットをバインドするのに失敗しているように見えるけど、それがエラーの原因かどうかはよく分からない。
$ openssl ocsp -index index.txt -CA cacert.pem -rsigner cacert.pem -port 8888
Error setting up accept BIO
3148073508:error:02006016:system library:bind:Invalid argument:/u7/NetBSD/src/crypto/dist/openssl/crypto/bio/b_sock.c:759:port='8888'
3148073508:error:20069075:BIO routines:BIO_get_accept_socket:unable to bind socket:/u7/NetBSD/src/crypto/dist/openssl/crypto/bio/b_sock.c:761:
(追記)
どうも NetBSD 5.0.2 付属の OpenSSL (OpenSSL 0.9.9-dev 09 May 2008) のバグらしい。
FreeBSD 8.0 付属の OpenSSL 0.9.8k 25 Mar 2009 だとちゃんと動く。OpenSSL 本家のサイトから
OpenSSL 1.0.0a を持ってきてコンパイルしたら動作した。
(追記2)
動いたと思ったら、IPv6 アドレスの ::1 にしかバインドしてくれない。-url とかでホストを指定しても無視されてるっぽい。