#chiroito ’s blog

Java を中心とした趣味の技術について

Google Trust Services CAの証明書を OpenShift に適用

※2024年3月13日に更新

自宅にGoogle Domainsでドメイン情報を管理しながらOpenShiftを導入したところ、Chromeからコンソールに繋ごうとすると接続できなくて困ったので、それを修正する備忘録です。

OpenShiftのインストールが終わるとこんな画面になります。

暫定対処としては、PCで、この画面のどこかをマウスでクリックしてthisisunsafeと入力すると開けます。iPad ではできませんでした。

最終的なゴールはちゃんと保護された状態で接続できるようにすることです。

事前準備

Google Trust Service の EABキーとACME DNS APIのアクセストークンが必要です。

まずは、Google Trust Services にアクセスするために必要な情報を取得します。

「EABキーを取得」をクリックします。

次に、同じくセキュリティにあるACME DNS APIにあるトークンを作成をクリックします。

証明書を作成

まずは、証明書を作成するツールをダウンロードします。

git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh

次に証明書作成に必要な環境変数を用意します。ocコマンドがちゃんと動かない場合は、Red Hat Hybrid Cloud Consolekubeconfig をダウンロードしてきてホームディレクトリに.kube/configファイルとして配置しましょう。

export LE_API=$(oc whoami --show-server | cut -f 2 -d ':' | cut -f 3 -d '/' | sed 's/-api././')
export LE_WILDCARD=$(oc get ingresscontroller default -n openshift-ingress-operator -o jsonpath='{.status.domain}')
export EAB_KEY_ID=<Google DomainsのEABキーID>
export EAB_HMAC_KEY=<Google DomainsのEAB HMACキー>
export GOOGLEDOMAINS_ACCESS_TOKEN=<ACME DNS APIのトークン>
export MAIL_ADDRESS=<自身のメールアドレス>
export DOMAIN=<自身のOpenShiftのドメイン> #今回はo.chiroito.dev

あとは発行の処理をするだけです。

./acme.sh --issue -d ${LE_API} -d *.${LE_WILDCARD} --dns dns_googledomains --server google

以下のようなログが出れば完了です。

[Wed Mar 13 10:28:06 JST 2024] Your cert is in: /root/.acme.sh/api.o.chiroito.dev_ecc/api.o.chiroito.dev.cer
[Wed Mar 13 10:28:06 JST 2024] Your cert key is in: /root/.acme.sh/api.o.chiroito.dev_ecc/api.o.chiroito.dev.key
[Wed Mar 13 10:28:06 JST 2024] The intermediate CA cert is in: /root/.acme.sh/api.o.chiroito.dev_ecc/ca.cer
[Wed Mar 13 10:28:06 JST 2024] And the full chain certs is there: /root/.acme.sh/api.o.chiroito.dev_ecc/fullchain.cer
[Wed Mar 13 10:28:06 JST 2024] _on_issue_success
[Wed Mar 13 10:28:06 JST 2024] 'dns_googledomains' does not contain 'dns'
[Wed Mar 13 10:28:06 JST 2024] The NOTIFY_HOOK is empty, just return.

エラーが起きたときは、--debugを付けて再実行しましょう。再実行時に--renewを付けても一定の間隔を待たないと発行できないようで、--forceを付けて強制的に再発行できます。

以前に比べるとかなり簡単に証明書を発行できるようになりました。

環境変数の登録が終わった後は、以下のコマンドでGoogle(?)にアカウントを作ります。

acme.sh --register-account  -m ${MAIL_ADDRESS} --server google \
--eab-kid ${EAB_KEY_ID} --eab-hmac-key ${EAB_HMAC_KEY}

[Tue Apr 18 18:17:35 JST 2023] Registering account: https://dv.acme-v02.api.pki.goog/directory
[Tue Apr 18 18:17:48 JST 2023] Registered
[Tue Apr 18 18:17:49 JST 2023] ACCOUNT_THUMBPRINT='XXXXXXX'

上記のログで最後の行に出力されているものを実行します。

ACCOUNT_THUMBPRINT='XXXXXXX'

証明書を作り始めましょう。1度目は失敗します。

./acme.sh --issue -d ${LE_API} -d *.${LE_WILDCARD} --dns dns_googledomains --server google

必要なTXTレコードが無いらしく、以下のエラーが発生します。

[Tue Apr 18 19:01:00 JST 2023] Using CA: https://dv.acme-v02.api.pki.goog/directory
[Tue Apr 18 19:01:00 JST 2023] Multi domain='DNS:api.o.chiroito.dev,DNS:*.apps.o.chiroito.dev'
[Tue Apr 18 19:01:00 JST 2023] Getting domain auth token for each domain
[Tue Apr 18 19:01:28 JST 2023] Getting webroot for domain='api.o.chiroito.dev'
[Tue Apr 18 19:01:28 JST 2023] Getting webroot for domain='*.apps.o.chiroito.dev'
[Tue Apr 18 19:01:28 JST 2023] Can not find dns api hook for: dns_googledomains
[Tue Apr 18 19:01:28 JST 2023] You need to add the txt record manually.
[Tue Apr 18 19:01:28 JST 2023] Add the following TXT record:
[Tue Apr 18 19:01:28 JST 2023] Domain: '_acme-challenge.api.o.chiroito.dev'
[Tue Apr 18 19:01:28 JST 2023] TXT value: '65fNOPeBc5XQs0Q1nuNk3Z3npDKZ_cRjYKalHaxgsZo'
[Tue Apr 18 19:01:28 JST 2023] Please be aware that you prepend _acme-challenge. before your domain
[Tue Apr 18 19:01:28 JST 2023] so the resulting subdomain will be: _acme-challenge.api.o.chiroito.dev
(略)
[Tue Apr 18 19:01:28 JST 2023] Domain: '_acme-challenge.apps.o.chiroito.dev'
[Tue Apr 18 19:01:28 JST 2023] TXT value: 'LIAk1oBiufG5CdkJQiTZinorXzI9AJAIsdI5Jc1e6xI'
(略)
[Tue Apr 18 19:01:28 JST 2023] Please add the TXT records to the domains, and re-run with --renew.
[Tue Apr 18 19:01:28 JST 2023] Please add '--debug' or '--log' to check more details.
[Tue Apr 18 19:01:28 JST 2023] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh

こういうのが複数行出力されます。

[Tue Apr 18 19:01:28 JST 2023] Domain: '_acme-challenge.api.o.chiroito.dev'
[Tue Apr 18 19:01:28 JST 2023] TXT value: '65fNOPeBc5XQs0Q1nuNk3Z3npDKZ_cRjYKalHaxgsZo'

ログで言われたとおりGoogle Domainsで以下のTXTレコードを作ります。出力された分全部必要です。今回は2つ出力されたので2つ作ります。

ドメイン
_acme-challenge.api.o.chiroito.dev 65fNOPeBc5XQs0Q1nuNk3Z3npDKZ_cRjYKalHaxgsZo
_acme-challenge.apps.o.chiroito.dev LIAk1oBiufG5CdkJQiTZinorXzI9AJAIsdI5Jc1e6xI

追加した後はこんな感じになります。

しばらくしたら--renewを追加して再実行しましょう。

./acme.sh --issue -d ${LE_API} -d *.${LE_WILDCARD} --dns dns_googledomains --server google --renew

(略)

[Tue Apr 18 21:09:54 JST 2023] Your cert is in: /home/chiro/.acme.sh/api.o.chiroito.dev_ecc/api.o.chiroito.dev.cer
[Tue Apr 18 21:09:54 JST 2023] Your cert key is in: /home/chiro/.acme.sh/api.o.chiroito.dev_ecc/api.o.chiroito.dev.key
[Tue Apr 18 21:09:54 JST 2023] The intermediate CA cert is in: /home/chiro/.acme.sh/api.o.chiroito.dev_ecc/ca.cer
[Tue Apr 18 21:09:54 JST 2023] And the full chain certs is there: /home/chiro/.acme.sh/api.o.chiroito.dev_ecc/fullchain.cer
[Tue Apr 18 21:09:54 JST 2023] _on_issue_success

最後の行が出力されたら発行完了です。

OpenShiftへ証明書を適用

証明書の作成されたディレクトリへ移動して、ocコマンドで登録していきます。

cd /home/chiro/.acme.sh/api.o.chiroito.dev_ecc/
oc create configmap google-domain-ca --from-file=ca-bundle.crt=./ca.cer -n openshift-config
oc patch proxy/cluster --type=merge --patch='{"spec":{"trustedCA":{"name":"google-domain-ca"}}}'
# 次のコマンドを実行するとしばらく繋がらなくなる
oc create secret tls google-domain --cert=fullchain.cer --key=api.${DOMAIN}.key -n openshift-ingress
# 次のコマンドを実行するとしばらく繋がらなくなる
oc patch ingresscontroller.operator default --type=merge -p '{"spec":{"defaultCertificate": {"name": "google-domain"}}}' -n openshift-ingress-operator

あとは接続できなくなってから1,2分待つと保護された状態で接続できるようになります。

OpenShift がおかしくなったと感じたら。

失敗したときは、各行でそれぞれ以下のコマンドを実行しました。OpenShiftの知識はゼロなので、雰囲気でやってます。

# 作ったconfigmapを消す
oc delete configmap google-domain-ca -n openshift-config

# CAの設定を消す。最初の値を確認忘れのため、null を入れてます
oc patch proxy/cluster --type=merge --patch='{"spec":{"trustedCA":null}}'

# 作った secret の情報を消す
oc delete secret google-domain -n openshift-ingress

# defaultCertificate の設定を消す。最初の値を確認忘れのため、null を入れてます
oc patch ingresscontroller.operator default --type=merge -p '{"spec":{"defaultCertificate": null}}' -n 
openshift-ingress-operator

参考

Google Trust Services CA · acmesh-official/acme.sh Wiki · GitHub

Let’s Automate :: Let’s Encrypt TLS Certs for OpenShift 4 | by Karan Singh | Medium

第3章 証明書の設定 OpenShift Container Platform 4.12 | Red Hat Customer Portal