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 にしてしまうのもありでしょう。


  1. このパスワード付きの cacerts ファイルは、ca-certificates-java パッケージのインストールにより cacerts ファイルが存在しない場合に生成されるファイルのようで、OpenJDK 9 より cacerts ファイルが空になったことが関係しているらしい…