ファイヤープロジェクト
Webサーバでクライアント認証
2005-07-03T14:40+09:00   matsu
サーバの証明ができたので,こんどはクライアント認証をしてみる.
サーバ証明はサーバがサーバ証明書をクライアントに渡して,サーバが信頼できることを確認する. この際にその証明書はクライアントが信頼するCAから発行されているかどうかで信頼度をはかる. クライアント認証はこの逆の流れである. クライアントはサーバに証明書(クライアント証明書)を送る. サーバはクライアントから送信されるクライアント証明書が信頼するCAから発行されちているかどうかで信頼度をはかる. 以上から,クライアント認証をするには,以下の作業が必要となる.
  • クライアント証明書の発行
  • Webブラウザにクライアント証明書をインポート
  • サーバでクライアント認証に関する設定をする
  • サーバで信頼するCAの証明書を登録
まず,OpenSSLがクライアント証明書を発行するようにOpenSSLの設定ファイルを編集する.
$ cd ~/openssl/client
$ cp /etc/ssl/openssl.cnf .
$ vi openssl.cnf
設定ファイルに
nsCertType = client, email
と記述する. すでにnsCertTypeという項目があれば,そちらはコメントアウトする. 次にCSRを作成する.
/usr/lib/ssl/misc/CA.sh は設定ファイルを読み込んでくれないので,直接opensslを呼び出した. これにより以下の二つのファイルが出力される.
client-privatekey.pem
-keyoutオプションで指定したファイル. この証明書の秘密鍵が記述されている.
client-csr.pem
-outオプションで指定したファイル. この証明書のCSRが記述されている.
この証明書をCAに送り,署名する.
証明書をCAからクライアントに返し,PKCS12に変換する.
作成されたclient_cert.p12ファイルをWebブラウザにてインポートする. Firefoxだと以下のようにする.
設定->詳細->証明書マネージャ->あなたの証明書(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
上記ログを出力する際のログレベル.
上記設定にて信頼するCAの証明書ファイルを/etc/apache/ssl.cacrt/cacert.pemと指定したので,そのように配置する.
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ブラウザから送信されない.
matsu(C)
Since 2002
Mail to matsu