designetwork

ネットワークを軸としたIT技術メモ

BOSH-Lite Directorの証明書一式を更新する

こちらの記事で構築したBOSH-Lite環境だが、1年が経過し生成された証明書の期限が切れた。

designetwork.daichi703n.com

監視の仕組みを作っておらず、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証明書一式を更新した。

本環境は個人的な試験用で本番環境ではないが、安定稼働のためには証明書の期限を監視・通知する仕組みを作っておくことが重要。また、項目によっては自動更新の仕組みを構築しておけばさらに安心。