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

标签 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-AzADSpCredential -CertValue $credValue -StartDate $ce ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo : InvalidOperation: (:) [New-AzADSpCredential], Exception 
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.ActiveDirectory.NewAzureADSpCredentialCommand

编辑:

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

英语是我的母语,我确实理解该消息的基本含义。我不明白的是如何解决这个问题。我是服务主体的所有者。我的同事是一位业主。服务主体应该能够 self 管理(我认为)。我已经在我创建的服务主体上对此进行了测试,并且它有效。所以我不得不想:我这样做正确吗?如果没有,如何将证书凭据添加到 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

最佳答案

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

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

enter image description here

enter image description here

<小时/>

What I don't understand is how to address the issue. I am an owner of the Service Principal. My colleague is an owner.

就您而言,我想您可能误解了AD App(应用程序注册)服务主体(企业应用程序)的概念,它们是不同的,详细信息here 。您可能是 AD 应用程序的所有者,而不是服务主体(只是猜测:-)),如果是这样,您将无法运行命令 New-AzADSpCredential > 作为普通用户。

另请注意,当使用New-AzADSpCredential成功创建证书凭证( key 凭证)时,您将不会在应用程序注册 -> 您的 AD 应用程序 -> 证书和Secrets 页面,因为服务主体的证书凭证不是 AD 应用程序的。您可以通过 Get-AzADServicePrincipalCredential 获取它。

如果你发现你是AD应用程序(应用程序注册)的所有者,实际上你可以使用 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

enter image description here

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

enter image description here

The Service Principal should be able to administer itself (I would think).

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

关于azure - 如何使用 New-AzADSpCredential 添加证书凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59306069/

相关文章:

azure - 逻辑应用程序 - 从电子邮件中的 CSV 创建表

azure - 如何设置 Azure 存储模拟器以监听所有接口(interface)?

azure - 无法选择在 azure devops 中使用托管标识来连接容器注册表

Azure身份验证: Only allow users with MFA enabled

azure - 部署 MEAN 应用程序

azure - 我可以发布 Azure 辅助角色...但它不会自动启动吗?

asp.net-mvc - 无法让 Azure AD 组出现在用户声明中

c# - 如何解决使用Microsoft帐户登录时出现AADSTS700016错误?

azure-devops - Azure DevOps YAML "each"语法

azure - 如何获取 Azure DevOps 服务主体 ID + 名称