警告

Tomcatによるクライアント証明書認証は、現時点で品質保証はしておりません。

7.4. Tomcatで直接認証する場合の設定

本章では Tomcat によるクライアント証明書認証を行う場合の設定手順を説明します。

Tomcat(BaaSサーバ)はインストール済みとします。

7.4.1. 証明書の準備

使用する証明書は、HAProxyと同様です。 以下の証明書が必要となります。

  • サーバ証明書/秘密鍵 : 必須
  • CA証明書 : 必須
  • CRL (証明書失効リスト) : オプション

詳細は、 証明書の準備 を参照下さい。

7.4.2. KeyStore、TrustStoreの作成

TomcatでのTLSの終端を行う場合、証明書のフォーマットを変更する必要があります。 事前にpemフォーマットの以下ファイルを用意しておきます。

  • サーバ証明書
  • サーバ証明書の秘密鍵
  • CA証明書

KeyStoreの作成

まず openssl コマンドを使用してサーバ証明書、秘密鍵をPKCS#12形式にまとめます。

$ openssl pkcs12 -export -inkey <サーバ証明書秘密鍵> -in <サーバ証明書>  -name <alias> -out <出力ファイル名 KCS#12形式> -certfile <中間CA証明書(オプション)>
Enter Export Password:              ... パスワードを入力
Verifying - Enter Export Password:

これを keytool コマンドを使用してJavaで使用するJava Keystore(JKS)に格納します。

keytoolはJDKのインストールディレクトリに格納されています。

$ keytool -importkeystore -srckeystore <生成したPKCS#12ファイル>  -destkeystore <出力先ファイル名(JKS)> -srcstoretype pkcs12 -deststoretype jks -srcalias <alias> -destalias <alias>
Importing keystore server_localhost.p12 to xxxx.jks...
Enter destination keystore password:  ... keystoreのパスワード
Re-enter new password:
Enter source keystore password:    ...  PKCS#12ファイルのパスワード

TrustStoreの作成

KeyStoreと同様に、クライアント証明書発行元のCA証明書を、TrustStoreに格納します。

$ keytool -import -v -trustcacerts  -alias <alias> -file <CA証明書> -keystore <出力先ファイル名(JKS)> -keypass <秘密鍵/KeyStoreのパスワード>
Enter keystore password:    ... パスワードの入力
Re-enter new password:
....  (証明書データの表示)
Trust this certificate? [no]:  yes   ... yesを入力
Certificate was added to keystore

作成したJKSファイルは、Tomcatが参照できるディレクトリに格納しておきます。

注釈

各種パスワードはTomcatへの設定を行う際に必要となります。 また秘密鍵の秘匿にも使用するため、安全な値を設定してください。

7.4.3. Connectorの設定

設定ファイルは以下に格納されています。

${CATALINA_HOME}/conf/server.xml

Tomcat Connectorのコンフィギュレーションの例 を参照してConnectorを編集します。

設定変更後、Tomcatの再起動を行ってください。

あわせてfirewallの設定、再起動を行い、待ち受けに使用するTCPポートを解放しておきます。

注釈

"${CATALINA_HOME}" はTomcatのインストールディレクトリを指します。

7.4.4. CRL更新用スクリプトの準備

CRLを使用する場合は、CRL更新用のスクリプトを準備します。 詳細は、 CRL更新用スクリプトの準備 を参照下さい。

スクリプトの例は、 CRL更新用スクリプトの例 を参照してください。

7.4.5. Tomcatの動作検証

curlを使用して、クライアント証明書認証が正常に動作しているか確認します。 パラメータに、pemフォーマットの証明書と秘密鍵を指定します。

認証が行われていることを確認するため、以下の条件で確認を行います。 詳細は BaaSサーバ設定 を参照下さい。

  • デベロッパーコンソールから、テナントとアプリケーションを作成する
  • システム設定 - クライアント証明書認証設定 から、任意のサーバキーを設定する
  • テナント設定 - クライアント証明書認証、及び証明書ユーザ登録を有効とする

以下コマンドで確認を行います。

$ curl -v --cert ./<クライアント証明書> --key ./<クライアント証明書の秘密鍵> \
  -H "X-Application-Id: <アプリケーションID>" -H "X-Application-Key: <アプリケーションKey>" \
  https://<host>:<port>/api/1/<テナントID>/users/current

クライアント証明書認証が正常に動作している場合、ユーザ情報が取得できます。 (通常未ログインのユーザは、自ユーザの情報取得はできません。)

注釈

private CAが発行したサーバ証明書を使用する場合、 --cacert オプションを追加し、pem形式のCA証明書を指定します。

--cacert ./<CA証明書>

Tomcatがローカルネットワークに存在する場合、proxy設定を無効にする必要があります。 --noproxy オプションを指定し、直接アクセスします。

--noproxy <tomcat_host>

クライアントへのレスポンス抜粋

200 OKとユーザ情報が返却されることを確認します。

< HTTP/1.1 200
...
< Date: Thu, 01 Mar 2018 07:44:30 GMT
<
* Connection #0 to host localhost left intact
{"_id":"5a97ab1909ff560fa5a825b8",
 "username":"client001",
 "email":"RRsejBclHNbvWREW@clientcert.dummy.example.com",
 ...
 "clientCertUser":true",
 ...
}

注釈

クライアント証明書が失効、有効期限切れ等の問題がある場合、TLSのセッション確立に失敗します。

この場合、新たなクライアント証明書の発行と配布が必要となります。

例: 証明書の有効期限切れのエラー

* NSS: client certificate from file
*       subject: CN=abcdedf,OU=...
*       start date:  6 14 02:33:50 2017 GMT
*       expire date:  6 15 02:33:50 2017 GMT
*       common name: abcdedf
*       issuer: E=mail@test.example.jp,CN=...
* NSS error -12224 (SSL_ERROR_CERTIFICATE_UNKNOWN_ALERT)
* SSL peer had some unspecified issue with the certificate it received.
* Closing connection 0
curl: (35) SSL peer had some unspecified issue with the certificate it received.