しばやん雑記

Azure Serverless とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure CDN / Front Door の Key Vault 証明書を自動更新するツールを作った

Azure CDN と Front Door には DigiCert の証明書を無料で発行して、自動で更新までしてくれる Managed Certificate が用意されていますが、Zone Apex 向けの証明書は対応していません。

そのため何処かの CA で証明書を発行し、Key Vault を使って持ち込む必要があります。実際に以前 Azure CDN の Alias record set を使って Zone Apex 対応を試したときには Key Vault を使いました。

Key Vault は安全に証明書を管理できるので便利ですが、Azure CDN と Front Door は何故か Key Vault 証明書の更新タイミングで、新しい証明書の自動デプロイを行ってくれません。

それぞれのドキュメントの FAQ にて手動でのデプロイが必要だと記載されています。

7. How do cert renewals work with Bring Your Own Certificate?

To ensure a newer certificate is deployed to PoP infrastructure, simply upload your new certificate to Azure KeyVault, and then in your TLS settings on Azure CDN, choose the newest certificate version and hit save. Azure CDN will then propagate your new updated cert.

Tutorial - Configure HTTPS on an Azure CDN custom domain | Microsoft Docs

Does Front Door support autorotation of certificates?

For your own custom TLS/SSL certificate, autorotation isn't supported. Similar to how it was set up the first time for a given custom domain, you will need to point Front Door to the right certificate version in your Key Vault and ensure that the service principal for Front Door still has access to the Key Vault.

Azure Front Door - Frequently Asked Questions | Microsoft Docs

殆どのケースでは DigiCert が発行する Managed Certificate で問題ないのかもしれませんが、Front Door では Zone Apex やワイルドカードを使いたいこともあるはずです。

その場合には Key Vault で証明書を持ち込む以外の方法はありません。2020Q1 に自動更新に対応する予定と聞いていましたが、全く音沙汰がないのと Let's Encrypt の 90 日証明書を手動で更新するのは現実的ではないので、自動更新するための簡単なツールを作りました。

仕組みは単純で RBAC で対象となる CDN Profile や Front Door に権限を与えると、Key Vault 証明書が更新されてから 24 時間以内に自動でデプロイするというものです。1 日 1 回だけ証明書のバージョンと CDN / Front Door にデプロイされている証明書のバージョンをチェックしています。

README を全然書いていないので、まずはこっちで設定方法を軽く書いておきます。今は daruyanagi.com を Azure CDN + Let's Encrypt で運用しているので、これの自動更新を設定します。

CDN の場合は親となる CDN Profile に Contributor ロールを Function App に割り当てます。

f:id:shiba-yan:20200531034307p:plain

Key Vault の Access Policy にも設定を追加しますが、このあたりの設定は色々な所で出てくるので省きます。

Let's Encrypt で発行した証明書は Key Vault Acmebot を使ってサクサク作成して、初回の証明書だけは手動で有効化しておきます。そうしないと Key Vault 証明書を特定できないので必須の作業となります。

設定自体はこれだけなので、後は Key Vault 証明書を更新して Function App が動作するのを待ちます。

f:id:shiba-yan:20200531034551p:plain

ログを都度確認する必要はないですが、今回はテストなので Azure Portal から実行ログを確認しておきます。

現在 CDN に設定されている証明書の Secret Version と Key Vault 証明書の最新 Secret Version が異なっているので、最新バージョンへの更新が行われます。

f:id:shiba-yan:20200531033336p:plain

CDN POP への証明書デプロイは非同期で行われるので多少時間がかかりますが、しばらく待った後にブラウザでサイトへアクセスすると新しい証明書の Thumbprint になっていることが確認できます。

f:id:shiba-yan:20200531034837p:plain

Front Door の場合も全く同じ設定と動作になるので、今回は書いていませんが動作確認は終わらせています。

これで Key Vault 証明書を更新するだけで、CDN / Front Door の証明書が自動的に更新される世界になりました。正直、最初からあって当たり前の機能だと思うのですが、何故か実装が遅いので困ったものです。