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 件のコメント:
コメントを投稿