何をしたのか
rundeckは導入時は非SSLで動作していますが、そのためにChromeなどからアクセスすると警告表示がされます。プライベート空間で使っているのでそれで実用上問題ないと言えばないのですが、次第にうっとおしくなってきたのでSSLの設定を行いました。
プライベートCAに基づく証明書をcockpit用に作成しており、その証明書をkeytoolを使ってkeystoreやtruststoreに取り込むことでWebブラウザからのアクセスでは順当にSSLが有効になり、警告も表示されなくなりました。
SSLの有効化作業はうまくいったように見えました。
何がおきたのか
Rundeckの定義バックアップをCLI(rdコマンド)で行うようにスケジューリングしているのですが、こちらでエラーが出るようになりました。CLIはCLIでアクセスするURLを環境変数(RD_URL)で持たせているので、そちらの修正は当然なのですが、それとは別にCLI用のSSL設定が別途必要になります。
しかし、今度はJavaのSSLエラーが表示されるようになりました。
もう少し詳しく
段どりとしてはRundeckのCLIでSSLの設定ガイドにある、キーストアを作成するImport the certificateと、そのキーストアを使ってCLIを使うためのConfigurateを実施した後に発生しています。エラーは2種類発生しました。
エラー1
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
このエラーは作成したキーストアにCLIがアクセスできないことが原因でパスの間違いやオーナー、パーミッションの設定で解消しました。
エラー2
javax.net.ssl.SSLException: java.lang.RuntimeException:
Unexpected error: java.security.InvalidAlgorithmParameterException:
the trustAnchors parameter must be non-empty
このエラーはjavax.net.ssl.trustAnchorsが設定されていないために発生しているような印象を受けるので、RD_OPTでjavax.net.ssl.trustAnchorsを追加設定してみたのですが、"must be non-empty"は解消しませんでした。
結論としては(Rundeckのガイドにある)javax.net.ssl.trustStoreで指定したキーストアにつけられたパスワードが実行時に与えられていないことが原因でした。
-Djavax.net.ssl.trustStorePassword をRD_OPTに追加してパスワードを指定したところ解消しました。
エラーは解消していますが
Rundeckから提供されているRundeck CLI - SSL Configurationガイドには必要な情報はほぼ含まれていて、記載されている手順通りに進めれば実装できます。ただ、キーストアのパスワードについての記載がありません。
ガイドにある1. Import the certificate の最後で storepassについて言及されているにも関わらず、2. Configuration ではパスワードが出てこないことに疑問が浮かばなかったわけではないのですが、エラーメッセージからは原因を読み取ることができなかったので少々手間取りました。検索するとJREのca-certを別途導入せよ、みたいなページが出て来るのですがrundeckの本体はHTTPSでアクセスできるようになっているのでそれほど根幹的な問題ではないはずだ、という見通しも持ってはいました。
今回は、作成したキーストアの内容を確認しようとしたときパスワードを要求されたことが、原因を掴む契機になりました。