Azure 如何使用新的AzADSpCredential添加证书凭据

Azure 如何使用新的AzADSpCredential添加证书凭据,azure,azure-devops,azure-active-directory,Azure,Azure Devops,Azure Active Directory,我正在使用应用注册部署资源,证书即将过期。我正试图编写一个脚本来添加一个新的证书以延长此服务主体的生命,但无论我以自己、同事、服务主体本身的身份登录谁,我都会收到以下错误: New-AzADSpCredential : Insufficient privileges to complete the operation. At X:\XXX\XXXX\XXXXX\Add-NewDmfCertificate.ps1:496 char:63 + ... cipalName | New-AzADSpC

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

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
编辑:

一些评论让我对我的问题进行了阐述,因为我不确定自己是否清楚

英语是我的第一语言,我理解信息的基本意思。我不明白的是如何解决这个问题。我是服务负责人的所有者。我的同事是老板。我认为服务负责人应该能够管理自己。我已经在我创建的服务主体上对此进行了测试,并且效果良好。所以我不得不怀疑:我做得对吗?如果没有,如何向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

如果您的用户帐户是service principalEnterprise应用程序的所有者,则命令New AzADSpCredential将起作用

我测试了一个普通用户,他是服务主体的所有者,效果很好

我不明白的是如何解决这个问题。我是服务负责人的所有者。我的同事是老板

在您的情况下,我想您可能误解了AD AppApp注册和服务principalEnterprise应用程序的概念,它们是不同的,细节不同。您可能是广告应用程序的所有者,而不是服务原则只是猜测:-,如果是,您将无法作为普通用户运行命令New AzADSpCredential

另外请注意,当使用New AzADSpCredential成功创建证书凭据alkey凭据时,您将无法在应用程序注册->您的广告应用程序->证书和机密页面中找到它,因为服务主体的证书凭据不是广告应用程序的。您可以通过get AzADServicePrincipalCredential获得它

如果您发现您是AD AppApp注册的所有者,实际上您可以使用、检查或此模块命令

样本:

然后你可以在下面的应用注册页面上找到它

我认为服务负责人应该能够管理自己


是的,这是可能的。但是您需要将/directory角色赋予服务主体,类似的问题。

如果您的用户帐户是服务主体企业应用程序的所有者,则命令New AzADSpCredential将起作用

我测试了一个普通用户,他是服务主体的所有者,效果很好

我不明白的是如何解决这个问题。我是服务负责人的所有者。我的同事是老板

在您的情况下,我想您可能误解了AD AppApp注册和服务principalEnterprise应用程序的概念,它们是不同的,细节不同。您可能是广告应用程序的所有者,而不是服务原则只是猜测:-,如果是,您将无法作为普通用户运行命令New AzADSpCredential

另外请注意,当使用New AzADSpCredential成功创建证书凭据alkey凭据时,您将无法在应用程序注册->您的广告应用程序->证书和机密页面中找到它,因为服务主体的证书凭据不是广告应用程序的。您可以通过get AzADServicePrincipalCredential获得它

如果您发现您是AD AppApp注册的所有者,实际上您可以使用、检查或此模块命令

样本:

然后你可以在下面的应用注册页面上找到它

我认为服务负责人应该能够管理自己


是的,这是可能的。但是您需要将/directory角色赋予您的服务负责人,类似的问题。

好吧,这只意味着所有这些人没有足够的权限这样做?我不完全确定这是否意味着这一点。我已经做了足够多的Azure工作,怀疑我是否只是做错了。这就是为什么我用我的方式来表达这个问题:我该怎么做?如果是这种方式,为什么不起作用?如果不是,我应该使用什么方式?好吧,讽刺的是,你没有展示你是如何做到这一点的,所以我只能猜测是如何做到的,但这个操作需要Azure AD权限,而不是Azure RBAC,所以你的所有者权限在这里毫无意义。您需要应用程序读\写权限。最简单的方法是为自己分配应用程序管理员Azure AD rolewell,这只意味着所有这些人都没有足够的权限这样做?我不完全确定这是否意味着这一点。我已经做了足够多的Azure工作,怀疑我是否只是做错了。这就是我为什么要这么说的原因
我用我的方式回答了这个问题:我该怎么做?如果是这种方式,为什么不起作用?如果不是,我应该使用什么方式?好吧,讽刺的是,你没有展示你是如何做到这一点的,所以我只能猜测是如何做到的,但这个操作需要Azure AD权限,而不是Azure RBAC,所以你的所有者权限在这里毫无意义。您需要应用程序读\写权限。最简单的方法是将自己分配给应用程序管理员Azure,并将自己作为企业应用程序的用户,这样做效果很好。感谢您指出其中的区别。将我自己作为用户添加到企业应用程序中,效果很好。谢谢你指出了区别。
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