しばやん雑記

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

Azure Key Vault を使って Let's Encrypt 周りを自動化する Function を作った話

Twitter で世界のやまさが Azure Front Door を試していて、Key Vault 向けにも Let's Encrypt の証明書を自動でいい感じに出来れば良いみたいなオーラを感じ取ったので、前に作った App Service 向けのものからコピペで新しく Key Vault 向けを作ってみました。

鍵は Key Vault に保存されているので安全です。てか公式で欲しい Integration でした。

ちなみに Key Vault は単に証明書をストアする機能だけではなく、新しく CSR を作成したり、その後認証局で署名して貰った証明書をマージする機能もあるので、実装自体は非常に簡単でした。

統合された CA の場合は簡単なんですが Let's Encrypt は対応していないので、例によって Managed Service Identity を有効にした Azure Functions で処理させることになります。

Key Vault に証明書を格納すると、他の Azure サービスから簡単に扱えるようになるので便利です。Key Vault 内の証明書はバージョニングされているので、更新するといい感じに新しいものが使われていきます。

今のところは Front Door / Application Gateway v2 / App Service が Key Vault に対応しています。

App Service に関しては Key Vault がまだ存在しない時期からのサービスなので、統合がちょっと弱いです。

とりあえず簡単に使い方を書いておきます。デプロイすると少なめの Functions が表示されるはずです。

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

App Settings に今回 Key Vault の URL が必要になっているので、LetsEncrypt:VaultBaseUrl というキー名で Key Vault のアドレスを設定しておきます。

例によって ARM Template を使ってデプロイすると、自動的に Managed Service Identity が有効化されるので、それに対してアクセス権を設定していきます。DNS-01 を使っているので Azure DNS への IAM 設定と、Key Vault の Access policy の設定が必要です。

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

Access policy は Certificates に対して List / Get / Create / Update が出来れば良いはずです。

ここまでの設定で証明書の発行が行えるようになっているので、適当な設定済みドメインを使って AddCertificate_HttpStart を叩けば証明書の発行処理が走ります。

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

今のところ Key Vault が RSA にしか対応していないので、デフォルトでは RSA 2048bit な証明書となります。App Service の方は単純にするために ECC 256bit 固定にしていました。

今回は最初から SAN 証明書に対応しています。コピペで作ったので当然ですね。

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

証明書の自動更新にも対応しているので、App Service 版と同様に 30 日前になると更新が行われます。

複数の App Service に同じ証明書を当てる場合には、通常ならそれぞれのリージョンの Service Plan 向けに PFX をアップロードする必要がありますが、Key Vault を使うと 1 箇所から読み込んでくれるので便利です。