これは Azure App Service 向けに Let's Encrypt 証明書の発行と更新を自動化するためのアプリケーションです。以下のような課題を解決するために開始しました。
- 複数の App Service への対応
- 簡単にデプロイと設定が完了する
- 信頼性の高い実装
- モニタリングを容易に (Application Insights, Webhook)
一つのアプリケーションで複数の App Service 証明書の管理が行えます。
証明書を様々なサービスで利用する必要がある場合は、Key Vault 版の Acmebot v3 の利用を検討してください。
https://github.com/shibayan/keyvault-acmebot
Key Vault 版は App Service / Application Gateway / CDN / Front Door といった Key Vault 証明書に対応したサービスで利用することが出来ます。
- Azure Web Apps と Azure Functions (Windows)
- Azure Web Apps (Linux) / Web App for Containers (Windows と Linux, Azure DNS が必要)
- Azure App Service Environment (Windows と Linux)
- デプロイスロットへの証明書の発行
- Zone Apex ドメイン向けの証明書の発行
- SANs (サブジェクト代替名) を持つ証明書の発行 (1 つの証明書で複数ドメインに対応)
- ワイルドカード証明書 (Azure DNS が必要)
- 一つのアプリケーションで複数の App Service に対応
- ACME と互換性のある証明書発行機関への対応
- Azure サブスクリプション
- カスタムドメインを登録済みの App Service
- E メールアドレス (Let's Encrypt の利用登録に必要)
Azure Portal にて 認証/承認
メニューを開き、App Service 認証を有効化します。「要求が認証されない場合に実行するアクション」として Azure Active Directory でのログイン
を選択します。認証プロバイダーとして Azure Active Directory を利用することを推奨していますが、他のプロバイダーでもサポート外ですが動作します。
認証プロバイダーとして Azure Active Directory を選択し、管理モードとして 簡易
を選択し「OK」を選択します。
最後にこれまでの設定を保存して、App Service 認証の有効化が完了します。
対象のリソースグループの アクセス制御 (IAM)
を開き、デプロイしたアプリケーションに対して Web サイト共同作成者
と Web プラン共同作成者
のロールを割り当てます。
備考
もし対象の App Service と紐づく App Service Plan が別々のリソースグループに存在する場合、App Service が存在するリソースグループには Web サイト共同作成者
を、App Service Plan が存在するリソースグループには Web プラン共同作成者
を割り当てる必要があります。
ブラウザで https://YOUR-FUNCTIONS.azurewebsites.net/add-certificate
へアクセスして、Azure Active Directory で認証すると Web UI が表示されます。その画面から対象の App Service とドメインを選択して実行すると、数十秒後に証明書の発行が完了します。
アクセス制御 (IAM)
の設定が正しくない場合には、ドロップダウンリストには何も表示されません。
ワイルドカード証明書もしくは Linux 向けの証明書を発行するには Azure DNS が必要なため、対象の DNS ゾーンが含まれているリソースグループにて DNS ゾーンの共同作成者
のロールを割り当てます。
App Service on Linux や Web App for Containers 向けに証明書を発行するためには、常に Azure DNS が必要となります。
アプリケーションは数日に 1 回、発行者が Let's Encrypt Authority X3
もしくは Let's Encrypt Authority X4
の証明書に対して有効期限のチェックを実行します。
デフォルトのチェックタイミングは UTC の 00:00 となります。タイムゾーンに合わせた変更が必要な場合には WEBSITE_TIME_ZONE
を使ってタイムゾーンを設定してください。
このアプリケーションは自動的に更新されるため、常に最新バージョンを利用することが出来ます。明示的に最新バージョンをデプロイする必要がある場合は、Azure Function を再起動します。
Causes Azure REST API error at GetSite or Dns01Precondition エラーが発生する
対象のリソースグループへのロール割り当てが間違っているか、まだ反映されていない可能性があります。IAM 設定の反映には 30 分ほどかかる可能性があります。
CheckDnsChallenge failed: _acme-challenge.{domain}.com value is not correct エラーが発生する
証明書を発行するために、Acmebot は Azure DNS で_acme-challenge
の TXT DNS レコードを作成する必要があります。このエラーは TXT レコードが作成されていない場合に発生します。この原因の 1 つはドメインのネームサーバーが Azure DNS ではなく、ドメインレジストラを指している可能性があります。ドメインを Azure DNS に適切に委任していることを確認してください。Azure DNS でドメインをホストする
CheckHttpChallenge failed: http://{domain}/.well-known/acme-challenge/{challenge} is InternalServerError status code エラーが発生する
主に URL Rewrite によって発生するエラーなので、wwwroot の下に存在する web.config に inheritInChildApplications="false"
の追加を試してみてください。
- ACMESharp Core 作者 @ebekker
- Durable Functions 作者 @cgillum とコントリビューター
- DnsClient.NET 作者 @MichaCo
このプロジェクトは Apache License 2.0 の下でライセンスされています。