証明書の失効とCRLの発行
2003/6/14作成
2004/9/19更新
主にクライアント証明書の場合ですが、発行したあとに秘密鍵が盗まれたり、紛失することがあります。
具体的には、pkcs12のファイルを勝手にコピーされたり、秘密鍵がビルのOSと一緒に心中してしまうこともあります。
また、発行した人が意図的に誰かに秘密鍵を配布したり、譲渡する可能性もあります。
そういった証明書をいつまでも信用するわけにはいかないので無効となった証明書のリストをCAから発行してクライアント証明書の検証をするWebサーバに配布します。
1.証明書の失効
さっそく、証明書を失効します。
CAで発行した証明書を使ってCAで失効手続きをすることになります。
-revokeオプションのあとに、CAが発行した証明書を指定します。
# openssl ca -gencrl -revoke client-ca.crt
うまくいかない場合はopenssl.cnfを見直してみましょう。
今回はopensslのオプションを極力少なくするために、かなりopenssl.cnfに書き込んであります。
この時点では証明書の失効処理をしただけです。
この状態でindexを見てみると・・
R 040613132239Z 030614151059Z 03 unknown /C=JP/ST=Tokyo/O=yggdrasil.jp CA/CN=hogehoge/Email=hoge@example.com
一番頭に書いてある"R"はrevokeという意味です。そして、2つめのフィールドは失効予定日ですが、先に失効してしまったので3つめのフィールドで上書きされています。
2.CRLの作成
失効が完了したので、CRL(証明書失効リスト)を作成します。
# cd /etc/CA
# openssl ca -gencrl -out crl.pem
そうしてcrl.pemという証明書失効リストができました。
手順をわけましたが、実はこのコマンド一回でOKです。
# openssl ca -gencrl -revoke client-ca.crt -out crl.pem
3.Apacheの設定
クライアント証明書のときに設定を残しておいたところに手を加えます。
青字がクライアント証明書までで変更した箇所です。
赤は今回の変更箇所になります。
# ssl.conf
# 自分のサーバ証明書の場所を指定
SSLCertificateFile /usr/local/apache2/ssl/server-ca.crt
# サーバ秘密鍵の場所を指定
SSLCertificateKeyFile /usr/local/apache2/ssl/server.key
# サーバ証明書を署名したCAの証明書がさらに他のCAによって署名されて
# いる場合、rootCAまでの証明書のリストを置きます
# 今回はプライベートCAがrootCAになっているのでコメントアウト
#SSLCertificateChainFile /usr/local/apache2/ssl/ssl.crt/ca.crt
# CAの証明書の場所を指定
# PathとFileを選択可
# クライアント証明書が入るまではとりあえずコメントアウト
#SSLCACertificatePath /usr/local/apache2/conf/ssl.crt
SSLCACertificateFile /usr/local/apache2/ssl/ca.crt
# CAの発行した証明書失効リスト(CRL)を指定
SSLCARevocationFile /usr/local/apache2/ssl/crl.pem
# httpsアクセス時のクライアント証明書の扱いを指定します。
# require => クライアント証明書は必須
# optional => クライアント証明書は持っていてもいなくてもよい
# none => クライアント証明書は不要(持っていても無視)
# optional_no_ca => optionalと同じだが、CAの証明が無くても許可
SSLVerifyClient require
# RootCAまでの深さ
# デフォルトは"1"
# SSLVerifyDepth 10
4.アクセス
それではアクセスしてみましょう。
URLをhttpsに変更してアクセスすると、クライアント証明書を要求されるので、さっき失効したクライアント証明書を指定してみましょう。
ここでさっきの証明書を選択してOKします。
すると・・・
という具合に、さっきまでアクセスできていたのにできなくなってしまいました。
クライアント側ではなにもいじっていないのに、CAとWebサーバ側を変更するだけで特定の証明書をもったクライアントを拒否することができます。
ちなみに、別の有効なクライアント証明書を使えばログインできたのでサーバ側がおかしくなったわけではありません。
ところで、ここで出てくるメッセージってかなりとんちんかんな感じです。
取り消されている証明書はサーバ証明書じゃなく、クライアント証明書なんですけどね。
信頼するべきではないのはクライアントなのに・・
「クライアント証明書は失効されているためこのサイトにアクセスできません」くらいの書き方の方がいいと思うのですが。
Windowsがハングアップして強制終了したあとに再起動してディスクチェックしているときに出てくる次からはスタートメニューからWindowsを終了しなさいと言われるのと同じくらい理不尽なメッセージです(笑)
5.その他
今回はクライアント証明書を失効しましたが、同様の方法でサーバ証明書やCAの証明書も失効することができます。
特にCAの証明書失効リストはARLというようです。
せっかくCRLというすばらしいものがあるのですが、実際のところあまり運用されていないみたいです。
X.509のextentionの中に、CRL配布ポイントという属性にURLが書かれています。
いくつかのCAの証明書についてこのURLにアクセスしてみたのですが、ほとんど空っぽでした。
参考文献
OpenSSL: Documents http://www.openssl.org/docs/apps/openssl.html