こちらの記事で構築したBOSH-Lite環境だが、1年が経過し生成された証明書の期限が切れた。
監視の仕組みを作っておらず、BOSH環境が停止してしまっていたため、証明書を更新(再生成)し復旧させた。
エラー内容
BOSH VMにアクセスできなくなっており、bosh vms
で確認しようとすると以下の通りエラーとなった。
$ bosh vms Fetching info: Performing request GET 'https://192.168.1.222:25555/info': Performing GET request: Retry: Get https://192.168.1.222:25555/info: x509: certificate has expired or is not yet valid Exit code 1
openssl
コマンドで証明書期限を確認する。BOSHで生成された証明書は期限が1年となっており、期限が切れていた。(2020/1/1 時点)
$ openssl s_client -connect 192.168.1.222:25555 | openssl x509 -noout -dates depth=0 C = USA, O = Cloud Foundry, CN = 192.168.1.222 verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 C = USA, O = Cloud Foundry, CN = 192.168.1.222 verify error:num=21:unable to verify the first certificate verify return:1 notBefore=Dec 21 16:42:50 2018 GMT notAfter=Dec 21 16:42:50 2019 GMT
証明書更新
証明書更新の手順はこちらに記載の通り。
Credentials - Cloud Foundry BOSH
基本的にvars-store
として指定しているcreds.yml
(or CredHub
) から対象の証明書情報を削除して再デプロイすることで、新しい証明書が生成されて更新が完了する。証明書削除は削除用のops-fileを作成してbosh int
で入れ替えるか、creds.yml
の場合は手動で削除すれば良い。
※NATSの場合はBOSH VMの稼働に直接影響するため、後述の手順が必要となる。
冒頭の記事ではVirtualBox上に構築したBOSH Directorに外部からリモートアクセスできるようにしたが、BOSH Directorのデプロイ(create-env
)はうまく動かなかったので、VirtualBoxが稼働しているホスト上でデプロイを実行した。
$ vi creds.yml #以下の項目を削除する ... blobstore_ca: blobstore_server_tls: credhub_ca: credhub_tls: default_ca: director_ssl: mbus_bootstrap_ssl: nats_ca: nats_clients_director_tls: nats_clients_health_monitor_tls: nats_server_tls: uaa_service_provider_ssl: uaa_ssl: ...
更新不足があると後続作業でエラー
mbusの更新漏れエラー
Deploying: Creating instance 'bosh/0': Waiting until instance is ready: Post https://mbus:<redacted>@192.168.1.222:6868/agent: x509: certificate has expired or is not yet valid Exit code 1
blobstoreの更新漏れエラー
$ ./deploy-nginx.sh Using environment '192.168.1.222' as client 'admin' Using deployment 'nginx' Continue? [yN]: y Task 2009140 Task 2009140 | 08:07:57 | Preparing deployment: Preparing deployment (00:00:01) Task 2009140 | 08:08:09 | Error: Unable to render instance groups for deployment. Errors are: Failed to download blob, code 1, output: 'Error running app - Getting dav blob 029ec41b-cc41-45d8-a797-a805032ea290: Get https://192.168.1.222:25250/ae/029ec41b-cc41-45d8-a797-a805032ea290: x509: certificate has expired or is not yet valid', error: '' Task 2009140 Started Wed Jan 1 08:07:57 UTC 2020 Task 2009140 Finished Wed Jan 1 08:08:09 UTC 2020 Task 2009140 Duration 00:00:12 Task 2009140 error Updating deployment: Expected task '2009140' to succeed but state is 'error' Exit code 1
後続作業で各deploymentの再デプロイ
CredHub, UAAのCA証明書も更新されるため、それを参照している各deploymentも再デプロイして変更を反映させる。
例えばConcourseのdeploymentにCredHubを含んでいる場合などは、適切に反映されていないとこのようなエラーが出る。
$ credhub find --path / invalid_token: An I/O error occurred while reading from the JWK Set source: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
Concourse Input
Finding variable 'github_private_key': invalid_token: An I/O error occurred while reading from the JWK Set source: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
私の環境ではCredHubログインのタイミングでCredHub, UAAのCA Certを出力するようにしていたので、こちらを叩く必要があった。
$ cat credhub-login.sh bosh int ./creds.yml --path /credhub_ca/ca > credhub_ca_cert bosh int ./creds.yml --path /uaa_ssl/ca > uaa_ca_cert credhub login -s $BOSH_ENVIRONMENT:8844 \ --ca-cert credhub_ca_cert \ --ca-cert uaa_ca_cert \ --client-name credhub-admin \ --client-secret `bosh int ./creds.yml --path /credhub_admin_client_secret`
従来作業でエラーが出る部分はopenssl
コマンドで期限が更新されているかを確認しながらエラーを潰す。
NATSの証明書更新
NATSの証明書更新については、ダウンタイムが発生しないよう、こちらに記載の通りの手順で更新する必要がある。
CA Rotation - Cloud Foundry BOSH
今回は証明書期限切れ後の作業だったため、この手順を実施していないが、本番環境においては、事前にテストの上で計画的に証明書更新を実施する必要がある。
まとめ - BOSH-Lite Directorの証明書一式を更新する
BOSH-Lite Director環境のSSL/TLS, CA証明書一式を更新した。
本環境は個人的な試験用で本番環境ではないが、安定稼働のためには証明書の期限を監視・通知する仕組みを作っておくことが重要。また、項目によっては自動更新の仕組みを構築しておけばさらに安心。