【GKE】証明書のワイルドカード対応


GoogleマネージドSSL証明書はワイルドカードをサポートしていない

無効なドメイン名またはワイルドカード ドメイン名が spec.domains フィールドに指定されている場合。マネージド証明書では、*.example.com のようなワイルドカード ドメインをサポートしていません。
引用:https://cloud.google.com/kubernetes-engine/docs/how-to/managed-certs?hl=ja

GCPでも証明書を発行出来るのですがワイルドカードをサポートはしていません。

サブドメインが増えれば増えるほど管理する証明書が増えて大変になるのと、Ingressのyamlが凄く散らかるのでワイルドカード証明書を発行しようと思った次第です。(特に現行のプロジェクトは大量にサブドメインが増えるプロダクトなのでなおさらという感じ)

HelmのCert-managerとかを使えば、自動発行と自動更新やってくれるっぽいのですが2-3日格闘して諦めました。

ここに学習コスト今の段階で割きたくないな〜と思って、Lets Encryptで手動発行に切り替えた訳です。(期間は90日と短いのですがCronとか叩けば良いかと思った訳です。)

ワイルドカード証明書発行の手順

ほぼ以下ドキュメントの受け売りです。

自分で備忘録残した方が、もう一回触る時とかに探さなくて済むので自分で書きました。

参考:http://yuki-toida.hatenablog.com/entry/2018/03/23/203915

以下手順で進めていきます。

  • certbotのインストール
  • certbotの実行
  • DNSにTXTレコードを入力
  • Secret作成
  • IngressでSecret読み込み

certbotのインストール

$ brew install certbot

certbotの実行

以下項目を入力しましょう。

  • チャレンジ方式
  • Lets Encryptのエンドポイント
  • メールアドレス
  • ドメイン
$ sudo certbot certonly --manual \
    --preferred-challenges dns-01 \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -m [email protected] \
    -d *.sample.com

回数制限があるため通るまでは、ステージング環境(https://acme-staging-v02.api.letsencrypt.org/directory)をエンドポイントにしてもいいかもしれません。

参考:https://letsencrypt.org/ja/docs/rate-limits/

DNSにTXTレコードを入力

ターミナルでは以下のようなメッセージが表示されます。

Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

abcdeysheigfkeabcdeysheigfke

以下のように入力してエンターを押しましょう。

  • DNS名:_acme-challenge.example.com
  • 値:abcdeysheigfkeabcdeysheigfke

Secret作成

$ sudo kubectl create secret tls cert-secret-tls \
    --key /etc/letsencrypt/live/example.com/privkey.pem \
    --cert /etc/letsencrypt/live/example.com/fullchain.pem

IngressでSecret読み込み

ingress.yaml
  tls:
  - hosts:
    - '*.example.com'
    secretName: cert-secret-tls

REST APIでインフラ構築している場合は、Ingressでhostを指定してトラフィックを振り分けてもいいかもしれません。

もちろん、ワイルドカードでhostを指定した場合も、指定のNode Portにトラフィックが飛ぶようになっています。

参考:https://qiita.com/arthur_foreign/items/5d81ddfe76923ecd486f

ワイルドカード証明書が適用されているか確認

「ネットワーク サービス > 負荷分散」と移動して証明書が適用されているか確認しましょう。

以下のようになっていたらワイルドカードの証明書が適用されています。

ステージングのエンドポイントを叩いた場合は以下のような表示になります。

その場合は、エンドポイントを本番環境(https://acme-v02.api.letsencrypt.org/directory)に変えて、cert-botを実行してSecretを作成しましょう。

ワイルドカード証明書を発行した時にハマったこと

ワイルドカード証明書を発行した場合に、xx.xx.example.comのように階層が増えた場合は証明書として機能しませんでした。

他にもやりようはあるかもしれませんが、検証に工数がかかりそうだったので、僕は対応せずにマネージド証明書を利用しました。

参考:https://cloud.google.com/kubernetes-engine/docs/how-to/managed-certs?hl=ja