目次へ

11.5. CLIENT-CERT認証

CLIENT-CERT認証を使用するには、まずTomcatのconf/server.xmlのHTTPSを表す<Factory>で、clientAuth属性を「true」にします。

<Connector ...>
  <Factory className="org.apache.coyote.tomcat4.CoyoteServerSocketFactory"
           clientAuth="true" protocol="TLS" 
           keystoreFile=".keystore" keystorePass="tomcat" />
</Connector>

この状態でTomcatを再起動し、HTTPSでアクセスすると、以下のようにクライアント認証に使用する証明書の選択が求められます。(ただし、OSやIEのバージョンによっては、以下のウィンドウが表示されずに、「表示するページなし」のページが表示されることもあります) しかし前節で取り込んだユーザ証明書を選択することはできません。これはユーザ証明書がプライベートCAによって署名されているものの、プライベートCAが「Tomcatによって信頼されていない」からです。ユーザ証明書は「信頼されているCA」に署名されていなければなりません。

CLIENT-CERT認証画面

Javaアプリケーションでは、信頼するCAを「(JREのディレクトリ)/lib/security/cacerts」キーストアか、「javax.net.ssl.trustStore」プロパティで指定されるキーストアによって管理しています。デフォルトではjavax.net.ssl.trustStoreプロパティは指定されませんので、「(JREのディレクトリ)/lib/security/cacerts」キーストアに証明書が登録されている、CAを信頼します。TomcatもJavaアプリケーションですので、上記キーストアに証明書が登録されているCAを信頼します。したがってプライベートCAをこのキーストアに登録すれば、プライベートCAも「信頼できるCA」として扱われ、結果としてユーザの証明書も使用できるようになります。

ここでは「(JREのディレクトリ)/lib/security/cacerts」をそのまま使用せずにコピーし、コピーしたキーストアをjavax.net.ssl.trustStoreプロパティで指定するようにします。まずコピーしたキーストアにプライベートCAの証明書を追加します。追加にも「keytool」を使用します。

$ keytool -import -file cacert.pem -trustcacerts -alias 4dd.co.jp
    -keystore cacerts -storepass changeit

証明書の追加には「-import」オプションを指定し、「-file」オプションで証明書ファイルを指定します。この際、指定する証明書は、プライベートCAを作成する際に作成したプライベートCA自身の証明書ファイルです。またこの証明書を信頼できるものとして登録しますので、「-trustcacerts」オプションを指定します。「-alias」「-keystore」「-storepass」はこれまでの場合と同じです。JREのcacertsキーストアのパスワードは「changeit」ですので、それを指定します。

あとはjavax.set.ssl.trustStoreプロパティを指定して、Tomcatを起動するだけです。Windowsの場合には「bin/catalina.bat」に

set JAVA_OPTS="-Djavax.net.ssl.trustStore=(cacertsへのフルパス)-Djavax.net.ssl.trustStorePassword=changeit"

Linuxの場合は「bin/catalina.sh」に

JAVA_OPTS="-Djavax.net.ssl.trustStore=(cacertsへのフルパス)-Djavax.net.ssl.trustStorePassword=changeit"

を先頭の方に記述します。Tomcatを起動し、HTTPSでアクセスすると、以下のように証明書を選択するダイアログが表示されます。(ただし、OSやIEのバージョンによっては、以下のウィンドウが表示されずに、内容またはエラーページが表示されることもあります) 使用する証明書を選択すると、Webアプリケーションが実行されます。

クライアント認証画面2

これまでの設定だけでは、信頼できるCAによって署名されているユーザ証明書を持っていれば、Webアプリケーションにアクセスすることができます。CLIENT-CERT認証を利用することによって、特定のユーザ証明書を持っているユーザに対してだけ、アクセスを許可できるようになります。CLIENT-CERT認証を用いるためには、web.xmlの<auth-config>をCLIENT-CERTにします。また<login-config>内には<auth-config>以外に必要ありません。

<login-config>
  <auth-config>CLIENT-CERT</auth-config>
</login-config>

続いてユーザ情報(MemoryRealmで使用しているファイル)を管理しているuser.xmlを編集します。CLIENT-CERTを利用する場合には、例のようにユーザ名として署名情報をそのまま記載します。その際、例のような順番になるよう注意してください。なお署名情報に関しては、ブラウザの署名ダイアログなどから確認するようにして下さい。

またパスワードには、ユーザの証明書を作成する際に指定した、チャレンジパスワードを指定します。

  <user username="CN=Hatanaka, OU=developing, O=4dd, ST=Kyoto, C=JP"
        password="akihiro"
        roles="manager"/>

以上の設定により、アクセス制限されたWebリソースに、証明書を用いてアクセスできるようになります。

実習課題5

実習課題2のWebアプリケーションを、CLIENT-CERT認証を行うように改良しなさい。

またブラウザにユーザの証明書をもう1つ登録し、その証明書では制限されていない部分にはアクセスできるが、制限されている部分にはアクセスできないことを確認しなさい。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp
  • シナジーマーケティング研究開発グループブログ