Azure App Serviceの証明書インポート時のエラー
ポータルからacmebotで発行した証明書をキーコンテナからAzure App Serviceにインポートしようした所エラーが出た。
The service does not have access to '/subscriptions/*******/resourcegroups/リソースグループ名/providers/microsoft.keyvault/vaults/キーコンテナ名' Key Vault. Please make sure that you have granted necessary permissions to the service to perform the request operation.
Key Vault Certificate Userをapp serviceのマネージドIDに権限は与えているのになぜ?
詳細なエラーを見るためにコマンドで証明書をインポートしてみる。
az webapp config ssl import \
--resource-group [リソースグループ名] \
--name app service名 \
--key-vault [キーコンテナ名] \
--key-vault-certificate [証明書の名前]
# エラー
Unable to verify Key Vault permissions.
You may need to grant Microsoft.Azure.WebSites service principal the Secret:Get permission
Find more details here: https://azure.github.io/AppService/2016/05/24/Deploying-Azure-Web-App-Certificate-through-Key-Vault.html
The service does not have access to '/subscriptions/****/resourcegroups/[リソースグループ名]/providers/microsoft.keyvault/vaults/[キーコンテナ名]' Key Vault. Please make sure that you have granted necessary permissions to the service to perform the request operation.
エラーの中にあるURLに書いてあった。
デフォルトでは、Web アプリ RP は顧客の KV にアクセスできません。証明書の展開に KV を使用するには、次の PowerShell コマンドを実行して RP を承認する必要があります。
RP には KV への読み取りアクセスが必要です。abfa0a7c-a6b6-4736-8310-5855508787cdは RP サービスプリンシパル名で、すべての Azure サブスクリプションで同じです。
Azure Gov クラウド環境では、6a02c803-dafd-4136-b4c3-5a6f318b4714上記のコマンドで RP サービスプリンシパル名として「abfa0a7c-a6b6-4736-8310-5855508787cd」の代わりに RP サービスプリンシパル名を使用する必要があります。
最後に必要なのは、デプロイする PFX 証明書を含む KVS です。証明書をデプロイする前に、RP は KVS に対して以下のチェックを実行します。
https://azure.github.io/AppService/2016/05/24/Deploying-Azure-Web-App-Certificate-through-Key-Vault.html
噛み砕くとこんな感じ。
重要:App ServiceがKey Vaultから証明書を取得するための権限設定
App ServiceがKey Vaultから証明書を読み込むには、特別な権限設定が必要です。
なぜこの設定が必要なのか?
- App Serviceが証明書をインポートする際、Azureの内部システム(リソースプロバイダー)がKey Vaultにアクセスします
- このシステムには、あなたのKey Vaultを読み取る権限が最初から付与されていません
- そのため、手動でアクセス権限を与える必要があります
設定内容の説明:
-
abfa0a7c-a6b6-4736-8310-5855508787cd:Azure App Serviceのシステム(リソースプロバイダー)のID- この英数字の文字列は、全世界のAzureで共通の固定値です
- Azure Gov クラウドでは
6a02c803-dafd-4136-b4c3-5a6f318b4714を使用
-
Key Vault Secrets User:Key Vaultの証明書(シークレット)を読み取る権限
記事内ではPowerShellでしか書いてなかったがazコマンドで対処
az role assignment create \
--assignee abfa0a7c-a6b6-4736-8310-5855508787cd \
--role "Key Vault Secrets User" \
--scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/[リソースグループ名]/providers/Microsoft.KeyVault/vaults/[キーコンテナ名]"
ちなみにこれはポータルからやろうとすると出来なかった。
エラーもポータルからだと理解出来ないしもうちょっと親切に作って欲しい。ポータルからしか操作しない人は一生わかんないよ・・。
Discussion