2011年11月23日水曜日

Tomcat 6(Windows X64版) Filter機能を使ってみる

Filter機能を使用し、クライアント証明書を検証します。
今回は、クライアント証明書のSubjectNameのCN属性をチェックし、web.xmlの初期パラメタとマッチした値であれば認証OKとします。
また、web.xmlの<filter>要素には、初期パラメタusernameを定義し、認証を許可するCN値を指定します。
なお、Filterを実装するためには、servlet-api.jarを開発環境のビルドパスに設定する必要があります。

①Filterの実装クラスを作成します。ポイントは以下です。
・javax.servlet.Filterインタフェースを継承する必要があります。
・destroy,init,doFilterメソッドは必ず実装する必要があります。
以下は、今回実装したdoFilterメソッドのソースになります。
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

// 初期パラメタの読み込み
String user = config.getInitParameter("username");

if( user == null) {
// エラー処理
throw new ServletException("認証対象のユーザが指定されていません。");
}

log.info("Config User Name=" + user);

// 証明書の取得
X509Certificate certs[] = (X509Certificate[]) request
.getAttribute("javax.servlet.request.X509Certificate");
if (certs == null || certs.length != 1) {
// エラー処理
throw new ServletException("クライアント証明書が指定されていません。");
}
else{
// CNの取得
Principal principal = certs[0].getSubjectDN();
X500Name name = new X500Name(principal.getName());
String cn = name.getCommonName();

log.info("Certificate CN=" + cn);

if(user.equals(cn) == false){
throw new ServletException("認証に失敗しました。");
}
}
// 後のチェーンに渡す
chain.doFilter(request, response);
}


②JAVAクラスを作成したら、JARファイルを作成します。作成したJARをC:\Program Files\Apache Software Foundation\Tomcat 6.0\libに格納します。

③web.xmlに以下のFilter要素を定義します。
-----------------------
  <filter>
    <filter-name>certificatefilter</filter-name>
    <filter-class>com.yasuyasu.filter.cert.CertificateFilter</filter-class>
    <init-param>
        <param-name>username</param-name>
        <param-value>clientuser.yasuyasu.com</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>certificatefilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
----------------------

④Tomcatを再起動します。

⑤https://localhost:8443/sampleappにアクセスできることを確認します。
コンテナログには、以下が出力されており、実装したFilterクラスが呼ばれていることを確認できました。
---------------------------------------------------------------
2011/11/23 22:11:36 com.yasuyasu.filter.cert.CertificateFilter doFilter
情報: Config User Name=clientuser.yasuyasu.com
2011/11/23 22:11:36 com.yasuyasu.filter.cert.CertificateFilter doFilter
情報: Certificate CN=clientuser.yasuyasu.com
---------------------------------------------------------------

ちなみに、認証に失敗した場合、以下のエラーコード500の画面が表示されます。

0 件のコメント: