クライアント証明書が無いとアクセスできないようにする

Apache httpd 2.x で、SSLを有効にしていたのですが、ふとクライアントの制限をしてみる気になって、自己署名ですけど、やってみました。
まず、CAを立てておきます。で、ca.crt(CA証明書)と rand.dat(乱数ファイル) を用意します。

openssl genrsa -des3 -out client.key -rand rand.dat 1024
openssl req -new -key client.key -out client.csr
openssl ca -config client.cnf -out client.crt -infiles client.csr
openssl pkcs12 -export -in client.crt -inkey client.key -certfile ca.crt -out client.p12

上のコマンドは、次のことを行っています。

  1. 秘密鍵(client.key)を作ります。
  2. 署名要求(client.csr)を作ります。
  3. 証明書(client.crt)を作ります。この際、cnfファイルで、nsCertTypeserverでなくclient, emailにします。また、CAのパスフレーズを求められます。
  4. PKCS12形式のファイル(client.p12)を作ります。最初に秘密鍵パスフレーズを求められ、続いてPKCS12用のパスフレーズ設定を行います。

なお、PKCS12形式ファイル生成の際、パスフレーズを設定しますが、後述のブラウザへのインポートに使いますから、PKCS12ファイル配布の際は、あわせてパスフレーズを伝える必要があるようです(でも同一の手段で送るのは危険か)。
サーバサイドでは、次のような設定を行っておきます(SSLを有効にしている状態からの変更点のみ)。

SSLCACertificateFile 
SSLVerifyClient require
SSLVerifyDepth 10

クライアントサイドでは、client.p12を受け取り、パスフレーズを聞きます。ブラウザにインポートする際にパスフレーズを聞かれるので、先ほど聞いておいたパスフレーズを入力します。