ファイヤープロジェクト
Webアプリケーションでのクライアント証明書情報の取得
2005-07-03T19:00+09:00   matsu
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など証明書のいろいろな情報が取得できる. サンプルではついでにリクエスト上の全属性を表示してみた. 表示結果を以下に示す.
matsu(C)
Since 2002
Mail to matsu