Webアプリケーションでのクライアント証明書情報の取得
Tomcat上のWebアプリケーションでクライアント証明書情報を取得する方法を調査してみた.
ApacheとTomcatをmod_jkにて連係しているシステムで,Tomcat上のWebアプリケーションがクライアント証明書情報を取得する方法を調査する.
クライアント認証はApacheにて行い,Webアプリケーション到達時には認証済とする.
Webアプリケーションはリクエスト上のクライアント認証情報を取得して,それからクライアントを識別,特定し,Webアプリケーション上での権限などを設定するといった応用ができる.
本頁では,既にTomcatとmod_jkの連係はできているものとして,そこにクライアント認証のための設定をする方法を記述する.
httpd.confにてmod_jkの設定を追加する.
JaJakartaによると,Apacheがクライアント認証して,それに関連するデータをTomcatに転送する際にはいくつかの設定が必要らしい.
まず,SSL関連の設定として,以下を記述する.
<VirtualHost sslthor.fireproject.jp:443> SSLEngine on SSLCertificateFile /etc/apache/ssl.crt/server.crt SSLCertificateKeyFile /etc/apache/ssl.key/server.key SSLVerifyClient require SSLCACertificateFile /etc/apache/ssl.cacrt/cacert.pem SSLLog /var/log/apache/ssl_engine.log SSLLogLevel info SSLOptions +FakeBasicAuth +StdEnvVars +ExportCertData ServerAdmin matsu@fireproject.jp DocumentRoot /home/matsu/protected_html/ </VirtualHost>SSLOptionsが今回の追加である. 特にExportCertDataが証明書の転送の指定らしい. 次にmod_jkの設定を追記する.
JkWorkersFile /etc/libapache-mod-jk/workers.properties JkLogFile /var/log/apache/mod_jk.log JkLogLevel error JkMount /fireproject fp1 JkMount /fireproject/* fp1 JkExtractSSL On JkHTTPSIndicator HTTPS JkSESSIONIndicator SSL_SESSION_ID JkCIPHERIndicator SSL_CIPHER JkCERTSIndicator SSL_CLIENT_CERT最後の5つが今回追加した設定である. どれもデフォルトの値でよいので,別に記述しなくてもよいようだ. あとはApacheを再起動して準備完了である.
リクエストからクライアント証明書情報を取得して表示するサンプルJSPを作成してみた.
javax.servlet.request.X509CertificateをキーにしてrequestからgetAttributeすると,X509証明書オブジェクトが(配列で)取得できる. これがクライアント証明書情報で,シリアルナンバーやDN,署名者DNなど証明書のいろいろな情報が取得できる. サンプルではついでにリクエスト上の全属性を表示してみた. 表示結果を以下に示す.

