如何使用 New-AzADSpCredential 添加证书凭据

Tom*_*lla 2 azure azure-active-directory azure-devops

我正在使用应用程序注册来部署资源,但证书即将过期。我正在尝试编写一个脚本来添加新证书以延长此服务主体的寿命,但无论我以谁身份登录(我自己、同事、服务主体本身),我都会收到以下错误:

New-AzADSpCredential : Insufficient privileges to complete the operation. At X:\XXX\XXXX\XXXXX\Add-NewDmfCertificate.ps1:496 char:63 
+ ... cipalName | New-AzADSpCredential -CertValue $credValue -StartDate $ce ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo : InvalidOperation: (:) [New-AzADSpCredential], Exception 
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.ActiveDirectory.NewAzureADSpCredentialCommand
Run Code Online (Sandbox Code Playgroud)

编辑:

一些评论促使我阐述我的问题,因为我不确定我是否清楚。

英语是我的母语,我确实理解该信息的基本含义。我不明白的是如何解决这个问题。我是服务主体的所有者。我的同事是一位业主。服务主体应该能够自我管理(我认为)。我已经在我创建的服务主体上对此进行了测试,并且它有效。所以我不得不想:我这样做正确吗?如果没有,如何将证书凭据添加到 SP?如果我做得正确,我应该在哪里设置权限以允许 SP(最好)或 AD 用户进行此更改?

编辑2:

我是一个糟糕的用户。感谢您指出我忽略了包含代码示例。不确定它有多大帮助,但无论我的想法如何,我都知道足以将其包括在内。

param (
    [string] $ServicePrincipalName
)
$cert = New-SelfSignedCertificateEx (you'll forgive me for leaving this part out :)  )

$rawCert = $cert.RawData
$credValue = [System.Convert]::ToBase64String($rawCert)

Get-AzADServicePrincipal -DisplayName $ServicePrincipalName | New-AzADSpCredential -CertValue $credValue -StartDate $cert.NotBefore -EndDate $cert.NotAfter
Run Code Online (Sandbox Code Playgroud)

Joy*_*ang 6

如果您的用户帐户是Owner服务主体 ( Enterprise application) 的用户帐户,则该命令New-AzADSpCredential将起作用。

Owner我与作为服务主体的普通用户进行了测试,它工作正常。

在此输入图像描述

在此输入图像描述


我不明白的是如何解决这个问题。我是服务主体的所有者。我的同事是一位业主。

AD App(App registration)就您而言,我想您可能会误解和的概念service principal(Enterprise application),它们是不同的,详细信息请参见此处。您可能是OwnerAD 应用程序的成员而不是服务主体(只是猜测:-)),如果是这样,您将无法以New-AzADSpCredential普通用户身份运行该命令。

另请注意,当使用New-AzADSpCredential成功创建证书凭证(密钥凭证)时,您将不会在页面中找到它App registration -> your AD App -> Certificates & secrets,因为服务主体的证书凭证不是AD应用程序的。你可以通过 得到它Get-AzADServicePrincipalCredential

如果你发现你是OwnerAD App(App注册)的,其实你可以使用New-AzADAppCredential,查看示例2,或者这个AzureAD模块命令New-AzureADApplicationKeyCredential

样本:

Connect-AzureAD
$cer = New-SelfSignedCertificate -Subject "CN=TodoListDaemonWithCert" -CertStoreLocation "Cert:\CurrentUser\My"  -KeyExportPolicy Exportable -KeySpec Signature
$bin = $cer.GetRawCertData()
$base64Value = [System.Convert]::ToBase64String($bin)
$bin = $cer.GetCertHash()
$base64Thumbprint = [System.Convert]::ToBase64String($bin)
$keyid = [System.Guid]::NewGuid().ToString() 
New-AzureADApplicationKeyCredential -ObjectId "<object-id of the AD App>" -CustomKeyIdentifier $base64Thumbprint  -Type AsymmetricX509Cert -Usage Verify -Value $base64Value -StartDate $cer.NotBefore -EndDate $cer.NotAfter
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然后您可以在应用程序注册页面找到它,如下所示。

在此输入图像描述

服务主体应该能够自我管理(我认为)。

对的,这是可能的。但是您需要将Application Administrator/ Global Administratordirectory 角色授予您的服务主体,这里有类似的问题。