使用 KeyVault 和 Azure PowerShell 证书身份验证创建 Azure AD 应用程序

Posted

技术标签:

【中文标题】使用 KeyVault 和 Azure PowerShell 证书身份验证创建 Azure AD 应用程序【英文标题】:Create an Azure AD application with KeyVault & Azure PowerShell Certificate authentication 【发布时间】:2017-06-18 02:21:28 【问题描述】:

我尝试使用 Azure PowerShell 证书身份验证在 Azure AD 中创建应用程序,下面是 Powershell sn-p:

Login-AzureRmAccount

$certPassword = ConvertTo-SecureString $CertPassword -AsPlainText -Force

$x509 = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList     $certPath,$certPassword

$credValue = [System.Convert]::ToBase64String($x509.GetRawCertData())

$adapp = New-AzureRmADApplication -DisplayName $ApplicationName -HomePage $URL -IdentifierUris $URL -CertValue $credValue -StartDate $startDate -EndDate $endDate     

$sp = New-AzureRmADServicePrincipal -ApplicationId $adapp.ApplicationId

Set-AzureRmKeyVaultAccessPolicy -VaultName $VaultName  -ServicePrincipalName $sp.ServicePrincipalNames[1] -PermissionsToKeys all –PermissionsToSecrets all -ResourceGroupName $ResourceGroupName

已成功创建 Azure AD 应用程序,但是对于具有证书身份验证的 Azure AD 应用程序,创建后 keyCredentials 中的 customKeyIdentifier 和 value 为 null,这是我从 Azure 门户下载的应用程序清单的一部分:

"keyCredentials": [
      "customKeyIdentifier": null,
      "endDate": "2018-01-25T11:55:35.7680698Z",
      "keyId": "ca1e536c-2220-478b-af73-1198d125bb5f",
      "startDate": "2017-01-25T11:55:35.7680698Z",
      "type": "AsymmetricX509Cert",
      "usage": "Verify",
      "value": null
     ]

证书是使用本地生成的 makecert 命令创建的自签名证书。 我正在使用 2.0.1 的 Powershell 版本

使用应用程序 ID 和指纹检索令牌的 C# 代码

public static async Task GetAccessToken(string authority, 字符串资源,字符串范围) var context = new AuthenticationContext(authority, TokenCache.DefaultShared); var result = await context.AcquireTokenAsync(resource, AssertionCert); 返回结果.AccessToken;

此代码在 var 结果中出错,并显示“密钥集不存在”

有没有办法解决这个问题?

谢谢你:)

【问题讨论】:

【参考方案1】:

你看这里的答案了吗?

Create a Application in Azure AD with Azure PowerShell Certificate authentication

在 cmets 中,他提到 CustomKeyIdentifier 为 null 与身份验证无关。

您是否尝试过不考虑 null 值进行身份验证?\

编辑: 如果您想为您拥有的公共证书生成指纹,可以使用以下 powershell cmdlet:

$cer = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cer.Import(“mycer.cer”)
$bin = $cer.GetCertHash()
$base64Thumbprint = [System.Convert]::ToBase64String($bin)

我希望这会有所帮助。

【讨论】:

所以您的问题是关于值为 null 而不是您的应用程序不工作? 我已经根据 Powershell 版本 (2.0.1) 编写了与上述相同的代码。在此版本中创建新 AzureADApplication 的命令行开关已更改。但是使用证书对 AD 应用程序进行身份验证以检索 Keyvault 机密不起作用......因此,我正在查看清单文件,在那里我发现“customKeyIdentifier”:null。如何获得这个值?或任何 Powershell 命令来创建带有证书的 AD 应用程序并获取此 CustomerKeyIdentifier 值 据我所知,CustomKeyIdentifier 不是一个严格定义的属性。它应该代表上传到该密钥凭证的公共证书的指纹,但它的值不是由 AAD 自动设置的,因此用户可以发布任何与 x509 指纹大小匹配的内容。我将在上面的帖子中包含有关如何自己生成此代码的代码示例。 感谢您及时回复 Shawn.. 基本上我想使用证书对 AD 应用程序进行身份验证以检索 KeyVault 机密。特别是在这个 Powershell 版本中,命令行开关发生了变化......并且使用 powershell 创建带有证书的 AD 应用程序的代码工作正常......但是在 c# 级别,当我尝试通过传递 ApplicationID 和指纹来检索 keyvault 机密时......它错误地说“密钥集不存在”...我的控制台应用程序可以检索证书指纹也无法使用证书对应用程序进行身份验证...所以在搜索错误时.. docs.microsoft.com/en-us/azure/key-vault/… 我指的是这个文档链接

以上是关于使用 KeyVault 和 Azure PowerShell 证书身份验证创建 Azure AD 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure.Security.KeyVault.Secrets 的网络核心密钥保管库配置

使用KeyVaultClient定义Azure KeyVault密钥上的策略

利用KeyVault来加强存储Azure Storage访问密钥管理

Azure 函数和 Azure KeyVault 通过服务端点进行通信

Terraform - 尝试使用服务主体在 Azure 中创建资源并从 keyvault 中提取该 SP 密钥

从Xamarin表单访问Azure KeyVault