opensslを使用してクライアント証明書を作成します。作成手順はサーバ証明書の時と全く同じです。サーバ証明書の時はCNにFQDNを指定していたのが、クライアント証明書ではCNにユーザ名を指定するのが唯一の違いです。
- クライアント証明書用の秘密鍵を作成
- クライアント証明書要のCSRを作成
- 自前の認証局で署名
サーバ証明書だとサーバの数は限られるのでお金を払ってもよい気がしますが、クライアント証明書を正規の認証機関で署名してもらうのはかなり厳しいのではと思います。ここで自前の認証局が活躍となります。
つぎにユーザのインストール用にクライアント証明書をパッケージ化します。以下のようにopensslを使ってpkcs12という形式で、クライアント証明書・秘密鍵・認証局の証明書をまとめることができます。このときにpkcs12のパッケージ用のパスワードを設定します。
openssl pkcs12 -export -in huga.crt -inkey huga.key -certfile /etc/pki/CA/cacert.pem -out huga.p12
正規の認証局で署名してあれば認証局の配布は不要となります。秘密鍵をシステム側で作成して配布するのは本来の意味では間違いと思いますが、ユーザがCSRを作成して署名してもらうというのは(特にWindowsでは)現実的ではないので気にしないことにします。
ここで生成されたp12ファイルをWindows上でダブルクリックするとインストールすることができます。インストール時にpkcs12のパッケージのパスワードを入力します。OSおよびIEはこれで証明書を認識できます。
FireFoxでは別途ブラウザ上でクライアント証明書をインストールする必要があります。
Apache側の設定ですが、SSLの設定はすんでいると仮定します。ssl.confの以下の項目でクライアント証明書を発行した認証局の証明書を指定します。
SSLCACertificateFile /etc/pki/CA/cacert.pem
また次の設定で上記認証局で署名されたクライアント証明書がないとSSLでアクセスができなくなります。
SSLVerifyClient require
個別にユーザの制限を行う場合は以下のような設定を追加します。以下の例では/以下の場所で上記認証局で署名されたユーザhugaのみアクセス可能となります。
<Location />
SSLRequire %{SSL_CLIENT_S_DN_CN} in { "huga" }
</Location>
