Webサーバでクライアント認証
サーバの証明ができたので,こんどはクライアント認証をしてみる.
サーバ証明はサーバがサーバ証明書をクライアントに渡して,サーバが信頼できることを確認する.
この際にその証明書はクライアントが信頼するCAから発行されているかどうかで信頼度をはかる.
クライアント認証はこの逆の流れである.
クライアントはサーバに証明書(クライアント証明書)を送る.
サーバはクライアントから送信されるクライアント証明書が信頼するCAから発行されちているかどうかで信頼度をはかる.
以上から,クライアント認証をするには,以下の作業が必要となる.
- クライアント証明書の発行
- Webブラウザにクライアント証明書をインポート
- サーバでクライアント認証に関する設定をする
- サーバで信頼するCAの証明書を登録
まず,OpenSSLがクライアント証明書を発行するようにOpenSSLの設定ファイルを編集する.
/usr/lib/ssl/misc/CA.sh は設定ファイルを読み込んでくれないので,直接opensslを呼び出した.
これにより以下の二つのファイルが出力される.
証明書をCAからクライアントに返し,PKCS12に変換する.
作成されたclient_cert.p12ファイルをWebブラウザにてインポートする.
Firefoxだと以下のようにする.
$ cd ~/openssl/client $ cp /etc/ssl/openssl.cnf . $ vi openssl.cnf設定ファイルに
nsCertType = client, emailと記述する. すでにnsCertTypeという項目があれば,そちらはコメントアウトする. 次にCSRを作成する.
- client-privatekey.pem
- -keyoutオプションで指定したファイル. この証明書の秘密鍵が記述されている.
- client-csr.pem
- -outオプションで指定したファイル. この証明書のCSRが記述されている.
設定->詳細->証明書マネージャ->あなたの証明書(TAB)->インポートこのときパスワードを尋ねられるが,これはpkcs12へ変換した際に入力したパスワードを入力する.
まず,httpd.confにてクライアント認証を行うように設定をする.
前頁によってすでにHTTPSのためのバーチャルホストを設定しているので,そこにクライアント認証の設定を追加する.
<VirtualHost sslthor.fireproject.jp:443> SSLEngine on SSLCertificateFile /etc/apache/ssl.crt/server.crt SSLCertificateKeyFile /etc/apache/ssl.key/server.key SSLVerifyClient require #SSLCACertificatePath /etc/apache/ssl.cacrt/ SSLCACertificateFile /etc/apache/ssl.cacrt/cacert.pem SSLLog /var/log/apache/ssl_engine.log SSLLogLevel info ServerAdmin matsu@fireproject.jp DocumentRoot /home/matsu/protected_html/ </VirtualHost>追加した設定は以下である.
- SSLVerifyClient
- クライアント認証をするかどうか.
値には以下がある.
- none
- クライアント認証しない
- optional
- クライアント認証できる. クライアント認証しなくてもよいが,クライアント認証するときは妥当なクライアント証明書が必要.
- require
- クライアント認証が必須.
- optional_no_ca
- クライアント認証できる. クライアント認証しなくてもよいし,クライアント認証するときにクライアント証明書の妥当性が確認できなくてもよい.
- SSLCACertificateFile
- 信頼するCAの証明書ファイル. クライアント証明書はこの証明書ファイルのCAに署名されている必要がある. 信頼するCAが複数ある場合はSSLCACertificatePathでCAの証明書ファイルのあるディレクトリを指定する雰囲気だが,なぜかうまくいかなかった.
- SSLLog
- SSLに関するログ出力ファイル. トラブルシューティングのために設定してみた.
- SSLLogLevel
- 上記ログを出力する際のログレベル.
cp ~matsu/openssl/ca/demoCA/cacert.pem /etc/apache/ssl.cacrt/cacert.pemあとはサーバを再起動してWebブラウザにてアクセスする. 今回はSSLVerifyClientの値がrequireなので,Webブラウザにてクライアント証明書を削除するとアクセスできないことも確認した. また,今回はログファイルを見て,トラブルシューティングした. 以下に私が出会ったトラブルとその際のログ出力されたエラーコードを記述しておく.
- error:140890B2:SSL
- 信頼するCA証明書がない
- error:140890C7:SSL
- 信頼するCAとクライアント証明書に署名したCAが不一致か,クライアント証明書がWebブラウザから送信されない.

