サーバ認証
の際には、サーバから証明書を受け取り正規のサーバであることを確認します。
対して、クライアント認証
ではサーバがアクセスしてきたクライアントを正規のクライアントであるか判断します。任意の認証局が発行した証明書を持っているクライアントのみを正規のクライアントと判断します。
手順
クライアント認証を導入するための大まかな手順は以下の通りです。
- クライアント用秘密鍵を作成
- クライアント用秘密鍵をもとにCSRを作成
CA(認証局)
にCSR
を送り、証明書を発行してもらう- 証明書を
PKCS12形式
に変換 - クライアント証明書をWebブラウザにインストール
- apacheの設定編集
ここでは、テスト運用したいだけなので商用のCAを使わずに自己署名で証明書を作成します。
クライアント用秘密鍵を作成
ディレクトリ移動後、秘密鍵を作成します。
cd /etc/pki/tls/certs
openssl genrsa -out client.key 2048
client.key
という秘密鍵がカレントディレクトリに作成されます。
クライアント用秘密鍵をもとにCSRを作成
openssl req -new -key client.key -out client.csr
client.csr
というファイルがカレントディレクトリに作成されます。
クライアント証明書作成
ここではテスト用なので自己署名をして証明書を作成します。
openssl x509 -req -in client.csr -signkey client.key -days 3650 -out client.crt
client.crt
という証明書がカレントディレクトリに作成されます。なお、daysを3650日と指定しているため作成された証明書は10年間有効となります。
クライアント証明書をPKCS12形式に変換
cat client.key client.crt | openssl pkcs12 -export -out client.p12 -name "My Certificate 1"
エクスポートファイルのパスワードを作成しています。このパスワードはクライアントPCにインポートするとき利用します。
client.p12
という PKCS12形式
に変換された証明書がカレントディレクトリに作成されます。
クライアント証明書をWebブラウザにインストール
作成した client.p12
をクライアントPCにダウンロードします。client.p12ファイル
をダブルクリックするとインストールが開始されます。
後は、画面に従って進めてください。
クライアント証明書を PKCS12形式
に変換した際に作成したパスワードを入力します。
apacheの設定編集
/etc/httpd/conf.d/ssl.conf
を修正します。
# Certificate Authority (CA):
# Set the CA certificate verification path where to find CA
# certificates for client authentication or alternatively one
# huge file containing all of them (file must be PEM encoded)
#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
# Client Authentication (Type):
# Client certificate verification type and depth. Types are
# none, optional, require and optional_no_ca. Depth is a
# number which specifies how deeply to verify the certificate
# issuer chain before deciding the certificate is not valid.
#SSLVerifyClient require
#SSLVerifyDepth 10
# Certificate Authority (CA):
# Set the CA certificate verification path where to find CA
# certificates for client authentication or alternatively one
# huge file containing all of them (file must be PEM encoded)
SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
# Client Authentication (Type):
# Client certificate verification type and depth. Types are
# none, optional, require and optional_no_ca. Depth is a
# number which specifies how deeply to verify the certificate
# issuer chain before deciding the certificate is not valid.
SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile
- クライアント証明書を発行したCAの証明書ファイルを指定。
- クライアント証明書をCAの公開鍵で解読するため。
SSLVerifyClient
- 接続時にクライアント認証を必須とするかどうかを設定。
SSLVerifyDepth
- 1にするとCAに直接署名された証明書、もしくは
SSLCACertificateFile
で指定した証明書の CA によって署名されたクライアント証明書が許可される。
- 1にするとCAに直接署名された証明書、もしくは
SSL接続を強制させたかったので、/etc/httpd/conf/httpd.conf
に次の記述を追記。
<Directory /var/www/html>
SSLRequireSSL
</Directory>
設定終了後、apacheを再起動させます。
service httpd restart
以上でHTTPS接続時にクライアント認証が行われるかと思います。
(SSL関連は何かと上手くいかないことが多いです。その時はエラーログを見たりネットで検索してみてください。)
IEでHTTPS接続すると次の証明書の確認画面が表示されました。