概要
SSLを使ったクライアント認証は、特定のクライアント以外からサイトを見せたくない時、非常に便利に使えます。ここではMavenなどJavaのアプリケーションでもクライアント証明書を使う方法をまとめます。
全体の流れ
- JREに同梱されている証明書ストア
cacerts
にクライアント証明書を発行した認証局の認証局証明書をインポート - 実行時のシステムプロパティにcacertsやクライアント証明書を指定
- クライアント証明書が必要な特定のサイトが利用可能に
認証局証明書のインポート
JREに同梱されている証明書ストアcacerts
にインポートしないと、JREは実行時にインポートした認証局のみ認証されていると勘違いします。指定したファイルにある証明書のみ読み込みます。JREに同梱されているcacertsには主なルート認証局の証明書が入っているので、そこに自前認証局の証明書を読み込みましょう。
JREに同梱されているcacertsは$JRE_HOME/lib/security/cacerts
です。これを適当なパスにコピーし、認証局証明書をインポートしましょう。認証局証明書がどこにあるかは、認証局によって異なります。システム管理者に聞いてください。
認証局証明書のインポート
認証局証明書のインポートは下記のコマンドでOKです。
keytool -v -alias 適切なエイリアス名 -import -file 証明書ストアファイル -keystore cacerts
cacertsのパスワードを聞かれます。OracleのJREを利用しているのであれば、パスワードはchangeit
です。コマンドの最後にインポートするか聞かれるので、はい
もしくはYes
と入力しましょう。
実行時のシステムプロパティの指定
実行時に指定するシステムプロパティは下記の通りだ。
キー | 値の例 | 意味 |
---|---|---|
javax.net.ssl.trustStore | /USER_HOME/.m2/cacerts | 証明書ストアファイルへのパス |
javax.net.ssl.trustStoreType | jks | 形式。同梱がベースなので、未指定でも良い |
javax.net.ssl.trustStorePassword | changeit | 証明書ストアファイルのパスワード |
javax.net.ssl.keyStore | /USER_HOME/.m2/user.p12 | ユーザーの秘密鍵ストアファイル |
javax.net.ssl.keyStoreType | pkcs12 | 秘密鍵ストアファイルの形式(jks or pkcs12) |
javax.net.ssl.keyStorePassword | 秘密鍵エクスポート時のパスワード | 秘密鍵ストアファイルのパスワード |
これをMavenの起動時に読み込む.mavenrc
に書けばMavenでの利用時にクライアント認証がなされ、Eclipseの起動時に読み込むeclipse.ini
に書けばEclipseでの利用時にクライアント認証がされる。gradle
等でも利用できるはずだ。
よく出くわす問題
a. unable to find valid certification path to requested target
というエラーがでる
新たな証明書ストアファイルに証明書をインポートしてしまった時にこうなることがあります。インストールされているcacerts
に証明書をインポートしてみよう。