自宅にGoogle Domainsでドメイン情報を管理しながらOpenShiftを導入したところ、Chromeからコンソールに繋ごうとすると接続できなくて困ったので、それを修正する備忘録です。
OpenShiftのインストールが終わるとこんな画面になります。
暫定対処としては、PCで、この画面のどこかをマウスでクリックしてthisisunsafe
と入力すると開けます。iPad ではできませんでした。
最終的なゴールはちゃんと保護された状態で接続できるようにすることです。
事前準備
Google Trust Services にアクセスするために必要な情報を取得
「EABキーを取得」をクリックします。
証明書を作成
まずは、証明書を作成するツールをダウンロードします。
git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
次に証明書作成に必要な環境変数を用意します。oc
コマンドがちゃんと動かない場合は、Red Hat Hybrid Cloud Console でkubeconfig
をダウンロードしてきてホームディレクトリに.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 MAIL_ADDRESS=<自身のメールアドレス> export DOMAIN=<自身のOpenShiftのドメイン> #今回はo.chiroito.dev
環境変数の登録が終わった後は、以下のコマンドで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