使用AZ CLI创建服务主体时Key Vault未生成证书问题
问题描述
运行以下PowerShell脚本:
Write-Host "Creating KeyVault..." az keyvault create --name mykeyvault --resource-group myrg --location polandcentral Write-Host "Creating service principal..." az ad sp create-for-rbac --name mysp --role contributor --scopes "/subscriptions/subscriptionid/resourceGroups/myrg" --create-cert --cert mycert --keyvault mykeyvault
执行后Key Vault和服务主体已创建,但az ad sp create-for-rbac命令的--create-cert、--cert、--keyvault三个参数未生效:
- 在Azure门户查看Key Vault,发现其为空;
- 服务主体创建命令输出如下,与预期的使用Key Vault生成证书的输出不符:
{ "appId": "...", "displayName": "mysp", "password": "...", "tenant": "..." }
补充输出信息az ad sp create-for-rbac命令执行时返回:
Found an existing application instance: (id) <here goes the guid>. We will patch it. Creating 'contributor' role assignment under scope '/subscriptions/<sub_guid>' Role assignment already exists.
请问哪里操作出错了?
问题原因与解决办法
核心原因
同名的服务主体(SP)和对应Azure AD应用已存在。使用az ad sp create-for-rbac指定已存在的--name时,命令仅会对现有应用做补丁更新,不会执行创建证书并存储到Key Vault的操作——这三个证书相关参数仅在首次创建新服务主体/应用时生效。
解决步骤
清理现有同名资源
先删除已存在的服务主体和对应Azure AD应用,确保后续创建全新实例:# 获取现有服务主体ID az ad sp list --display-name mysp # 删除服务主体 az ad sp delete --id <上述命令返回的appId> # 删除对应Azure AD应用 az ad app delete --id <现有应用的guid>重新执行脚本
清理完成后,再次运行原脚本,此时命令会创建全新服务主体,同时触发证书生成逻辑,将mycert存入指定的Key Vault。验证结果
执行完成后:- 登录Azure门户查看Key Vault的「证书」列表,可找到
mycert; - 服务主体的输出会包含证书相关字段,不再返回密码信息。
- 登录Azure门户查看Key Vault的「证书」列表,可找到
替代方案
如果不想删除现有服务主体,可改用全新的名称执行az ad sp create-for-rbac命令,创建一个带证书的新服务主体。
内容的提问来源于stack exchange,提问作者Marek M.
相关产品推荐
相关产品推荐

