OpenJDK 9 の Docker イメージで InvalidAlgorithmParameterException が発生する問題を回避する
openjdk:9-jdk
など一部の OpenJDK の Docker イメージにて InvalidAlgorithmParameterException
の例外が発生する問題に遭遇したので、その解決方法をメモしておきます。
例外が発生する問題の概要
OpenJDK の Docker イメージ、具体的には openjdk:9-jdk
を使って Java アプリケーションをコンテナ内で実行し、そのアプリケーションから外部に HTTPS でリクエストを投げようとすると、 java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
の例外が発生してしまいます。
この問題は docker-library/openjdk の issue #145 にあるとおり、
- CA 証明書のキーストア (cacerts ファイル) にパスワード
changeit
が設定されている1 - 一方で同キーストアのパスワードを指定するシステムプロパティ
javax.net.ssl.trustStorePassword
が設定されていない
ことが原因で発生します。
問題を回避する方法
先の issue にも書いてありますが、この問題を回避する方法がいくつかあります。
その 1: システムプロパティ javax.net.ssl.trustStorePassword
を設定する
cacerts ファイルにパスワードが設定されているなら、そのパスワードをきちんと設定すればいいじゃない、という至極まっとうな解決策です。
java -Djavax.net.ssl.trustStorePassword=changeit ...
こんな感じで指定します。
その 2: slim イメージを使う
UI 関連のライブラリを 除外した いわゆる headless な Docker イメージである 9-jdk-slim
では (どういう理由なのか定かではないが…) cacerts ファイルにパスワードが設定されていないので、特に slim を使いたくない理由がなければこちらのイメージを使うのがよさそうです。
その 3: OpenJDK 9 を諦めて OpenJDK 10 を使う
openjdk:10-jdk
ではこの問題は解消済みなので、利用しているライブラリやフレームワークなどに JDK バージョンの制約がなければ 10 にしてしまうのもありでしょう。
-
このパスワード付きの cacerts ファイルは、ca-certificates-java パッケージのインストールにより cacerts ファイルが存在しない場合に生成されるファイルのようで、OpenJDK 9 より cacerts ファイルが空になったことが関係しているらしい… ↩