Let’s Encrypt証明書使用時、javaで証明書エラーが発生する

javaでhttpsアクセスしようとすると証明書エラーが発生します。

unable to find valid certification path to requested target redhat

別のサーバーであれば問題なく接続できるので、十中八九、証明書の問題なのだと思われます。

そして、証明書エラーが発生するのが「Let’s Encrypt」なので、どう考えてもこいつだと思われます・・・。

Let’s Encryptが利用できるのはどのjavaバージョンから?

公式情報によると、以下のように記載があります。

Java 8 >= 8u101

証明書の互換性(Let’s Encrypt公式サイト、日本語)

つまり、java1.8 update101 以降であればOKということになります。であれば、今回は要件を満たしているのでなんの問題もない・・・

しかし、日本語だけに頼っていると罠に引っかかります。よく見ると原文の英語の方にはより新しいページがあります。以下が英語版です。

Java >= 7u151, 8u141, 9+

証明書の互換性(Let’s Encrypt公式サイト、英語)

そうです、java1.8 update141 以上である必要があるのです。Let’s Encryptを利用するには

  • java1.7 update111 以上
  • java1.8 update141 以上
  • java1.9 以上

なぜ必要なjavaのバージョンが変わったの?

さて、なぜjavaのupdate要件が変わっているのかというと、2021年にLet’s Encrypt が利用するルート証明書が変更されたからです。

2021年9月末時点でLet’s Encryptが利用するルート証明書である「DST Root X3」が利用できなくなり、「ISRG Root X1」に切り替わっています。

「DST Root X3」→「ISRG Root X1」

そのため、java1.8 update101 では、「ISRG Root X1」が入っていないので、証明書エラーとなってしまうわけです。

まとめ

javaのバージョンをあげるか、トラストストアファイル(jssecacerts)を追加する方法になるかと思いますが、長い目で見てjavaのバージョンアップが良いと思います。