【问题标题】:How to use New-AzADSpCredential to add certificate credentials如何使用 New-AzADSpCredential 添加证书凭据
【发布时间】:2019-12-13 10:37:35
【问题描述】:

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

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

编辑:

一些 cmets 让我解释我的问题,因为我不确定我是否清楚。

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

EDIT2:

我是一个糟糕的用户。感谢您指出我忽略了包含代码示例。不知道它有多大帮助,但我知道的足够多,不管我的想法如何。

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

【问题讨论】:

  • 好吧,这只是意味着所有这些都没有足够的权限来做到这一点?
  • 我不完全确定这是否意味着。我已经做了足够多的 Azure 工作来怀疑我是否只是做错了。这就是为什么我用我的方式来表达这个问题:我应该怎么做?如果是这种方式,为什么它不起作用?如果不是,我应该使用什么方式?
  • 好吧,具有讽刺意味的是,您并没有展示您是如何做到的,所以我只能猜测如何,但是此操作需要 Azure AD 权限,而不是 Azure RBAC,因此您的所有者权限在这里毫无意义。您需要应用程序读\写权限。最简单的方法是为自己分配应用程序管理员 Azure AD 角色

标签: azure azure-devops azure-active-directory


【解决方案1】:

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

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


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

在你的情况下,我想你可能误解了AD App(App registration)service principal(Enterprise application) 的概念,它们是不同的,详情here。您可能是 AD App 的 Owner 而不是服务主体(只是猜测:-)),如果是这样,您将无法以普通用户身份运行命令 New-AzADSpCredential

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

如果你发现你是AD App的Owner(应用注册),其实你可以使用New-AzADAppCredential,查看Example 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

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

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

是的,这是可能的。但是您需要将Application Administrator/Global Administrator 目录角色赋予您的服务主体,类似问题here

【讨论】:

  • 将自己作为用户添加到企业应用程序,它运行良好。感谢您指出不同之处。
猜你喜欢
  • 2020-10-12
  • 2018-04-01
  • 2017-01-06
  • 2016-12-17
  • 1970-01-01
  • 2018-08-10
  • 2014-04-04
  • 2023-02-10
  • 2016-08-09
相关资源
最近更新 更多