運用中の業務アプリにおいて、外部サーバと連携しているものがあったのですが、
先月、その機能が突然、例外を吐き出すようになってしまったのです。
Caused by: com.sun.xml.ws.client.ClientTransportException: HTTPトランスポート・エラー : 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 at com.sun.xml.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:131) at com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:223) at com.sun.xml.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:145) at com.sun.xml.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:110) :
原因
その発生原因は、相手先サーバの更新作業が行われたようでした。
はじめて見る例外だと、多少慌ててしまいますね。
スタックトレースを見れば、一目瞭然です。
まあ、APサーバが古いのが問題なのでしょうね。
解決方法
一言で言えば、ブラウザで相手先サーバに接続し、新しい証明書を入手し、Payaraが管理する「Java キーストア(JKSファイル)」の中に、その証明書を格納して、サーバ再起動で復旧できました!
(1) 新しいパブリックSSL証明書を取得
相手先サーバへアクセスし、証明書をエクスポートして、入手します。
画面はChromeの例になります。
(2) JKSファイル管理ツール「portecle」を入手
次にサードパーティ製のアプリケーション「portecle」をダウンロードします。
「portecle」とは、キーストアをGUIでメンテナンスできるツールです。
(3) portecleツールで証明書を追加
portecleを起動します。
>cd C:\apps\portecle-1.11\portecle-1.11 >dir C:\apps\portecle-1.11\portecle-1.11 のディレクトリ 2024/02/01 17:40 <DIR> . 2024/02/01 17:40 <DIR> .. 2024/02/01 17:40 785,915 bcpkix.jar 2024/02/01 17:40 3,955,990 bcprov.jar 2024/02/01 17:40 <DIR> icons 2024/02/01 17:40 1,110 LICENSE.bouncycastle.txt 2024/02/01 17:40 18,092 LICENSE.txt 2024/02/01 17:40 1,542 net.sf.portecle.appdata.xml 2024/02/01 17:40 662 net.sf.portecle.desktop 2024/02/01 17:40 10,051 NEWS.txt 2024/02/01 17:40 456,080 portecle.jar 2024/02/01 17:40 6,260 README.md 9 個のファイル 5,235,702 バイト 3 個のディレクトリ 191,387,426,816 バイトの空き領域 >java -jar portecle.jar
次に、APサーバが管理している「キーストア」を選択して、OPEN。
私の環境では、「PAYARA_HOME\184\payara5\glassfish\domains\domain1\config\cacert.jks」を指定。
パスワードが求められます(既定値:changeit)
パスワードが通ると、証明書一覧が表示されました。
さらにエクスポートした証明書を選択して、追加します。
順に進めていくと......
格納されました!
キーストアファイルは、忘れずに保存してください。
(4) Payara再起動
最後に、payaraを再起動することで、JKSファイルが再読み込みされます。
systemctl restart payara
結果、元の通り、外部サーバにもアクセスすることができました。
オッケー、オッケー!!!