😀

無料の App Service マネージド証明書を Azure CLI で試してみた

に公開

背景と目的

無料の SSL/TLS 証明書と言えば、Let's Encrypt ですが、昔は Azure App Serivce に対して証明書を自動更新するスクリプトを用意して Cron を別環境で動かしていました。現在は無料の App Service マネージド証明書を使用して、自動更新も Azure に任せる方法がとても楽で便利です。ということで、Azure CLI で無料の App Service マネージド証明書を検証してみました。

前提条件

DNS に CNAME レコードを登録する必要があります。今回は Azure DNS を使用しますが、CNAME レコードが登録できて名前解決可能であれば良いです。

検証用の App Service を作成

bash
# 環境変数をセットします
region=japaneast
prefix=mnrappdev
domain=example.jp

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# App Service Plan を作成します
az appservice plan create \
  --name ${prefix}-plan \
  --resource-group ${prefix}-rg \
  --sku B1

# WebApp を作成します
az webapp create \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --plan ${prefix}-plan \
  --runtime "PHP|7.4"

# (省略可) 常時接続を有効にします
az webapp config set \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --always-on true

# (省略可) 自分の IP からのみアクセスを許可します
az webapp config access-restriction add \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --priority 100 \
  --rule-name MyIP \
  --action Allow \
  --ip-address $(curl -s inet-ip.info)

# (省略可) WebApp 自身からのループバックアクセスを許可します
az webapp config access-restriction add \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --priority 200 \
  --rule-name AppIP \
  --action Allow \
  --ip-address $(az webapp show \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --query outboundIpAddresses \
  --output tsv)

DNS に CNAME レコードを作成

bash
# WebApp へのアクセス用に CNAME レコードを登録します
az network dns record-set cname set-record \
  --resource-group ${prefix}-rg \
  --zone-name $domain \
  --record-set-name ${prefix} \
  --cname ${prefix}-app.azurewebsites.net

# ドメイン検証用に CNAME レコードを登録します
az network dns record-set cname set-record \
  --resource-group ${prefix}-rg \
  --zone-name $domain \
  --record-set-name awverify.${prefix} \
  --cname awverify.${prefix}-app.azurewebsites.net

ドメインと証明書を登録

bash
# ドメインを登録します
az webapp config hostname add \
  --webapp-name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --hostname ${prefix}.$domain

# マネージド証明書を作成します
az webapp config ssl create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-app \
  --hostname ${prefix}.$domain

# 作成したマネージド証明書をバインドします
az webapp config ssl bind \
  --certificate-thumbprint $(az webapp config ssl show \
  --resource-group ${prefix}-rg \
  --certificate-name ${prefix}.$domain \
  --query thumbprint \
  --output tsv) \
  --resource-group ${prefix}-rg \
  --name ${prefix}-app \
  --ssl-type SNI

# ブラウザでアクセスして確認します
open https://${prefix}.$domain

検証環境を削除

bash
# リソースグループを削除します
az group delete \
  --name ${prefix}-rg \
  --yes

参考

https://docs.microsoft.com/ja-jp/azure/app-service/configure-ssl-certificate?tabs=apex%2Cportal#create-a-free-managed-certificate

Discussion