Java17でjavax.net.ssl.SSLHandshakeException

こんにちは、開発担当の Masa です。

シーオーリポーツ 帳票クリエータ Ver.4 for Java は次期リビジョンアップ(2月予定)で Java17 に対応します。
Java17 対応作業中において、ハマった罠(個人的見解による)を紹介します。

javax.net.ssl.SSLHandshakeException: The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]

Java16 で TLS 1.0/1.1 が無効になったので出る有名なエラーですね。
本来ならテストサーバを更新するのが正しい対処なのですが、今回は応急処置で。

Java17のディレクトリ/conf/security にある java.security ファイルの jdk.tls.disabledAlgorithms から TLSv1 と TLSv1.1 を削除すると問題なく動作しました。

java.lang.IllegalAccessError: cannot access class sun.net.ftp.FtpClient (in module java.base)

帳票クリエータ Ver.4 for Java では FTPへのアップロード時に使用するライブラリを選択出来ますが、Java17 で実行する場合に sun.net.ftp.FtpClient の使用を選択すると以下のエラーが出ます。

jp.co.hos.coreports.exception.CrSystemException - java.lang.IllegalAccessError: class jp.co.hos.common.ftp.SunFtpClient (in unnamed module @0x7205765b) cannot access class sun.net.ftp.FtpClient (in module java.base) because module java.base does not export sun.net.ftp to unnamed module @0x7205765b

sun.net.ftp が無名モジュールからアクセス出来なくなっていますね。
古いシステムとの互換性を考えると帳票クリエータのモジュールシステムを今直ぐ新しくするのは出来ないのでエクスポートするようにオプションで指定します。

--add-exports java.base/sun.net.ftp=ALL-UNNAMED

無事動作しました。

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed

またしても SSLHandshakeException です。
今回は Java17 というよりも、Java17 のテスト環境更新で groovy を最新バージョンに更新したことが原因で出たエラーです。

javax.net.ssl.SSLException: Connection has closed: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Java はデフォルトのまま手を加えていないので、以下のオプションを指定し無事動作しました。


-Djavax.net.ssl.trustStore=cacerts
-Djavax.net.ssl.trustStorePassword=changeit

この他にも、XML 関係の依存モジュールが削除されていたり色々と対応が必要でした。
これからも Java のバージョンが上がる度に振り回されるんだろうなぁ。