首页 > 解决方案 > 2021 年,导出 Azure 自动化 AzureRunAsConnection 用于本地调试的证书的最快/最简单方法是什么?

问题描述

作为对我们的一个运行手册使用的服务主体的权限问题进行故障排除/诊断的一部分,Microsoft 支持要求我在本地运行相同的 PowerShell 代码,以便我们可以捕获日志。为此,我需要以与运行手册完全相同的方式进行身份验证,这意味着使用AzureRunAsConnection正在使用的证书进行身份验证。

在将一些仅存在于 Azure 自动化中的 cmdlet 换成 Azure RM 的等效命令(例如Get-AutomationConnection,必须替换为Get-AzAutomationAccountand Get-AzAutomationConnection,并且您必须切换到 using FieldDefinitionValues)之后,我的脚本的身份验证部分如下所示:

Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$PSDefaultParameterValues['*:ErrorAction']='Stop'

'*** Authenticating with Azure'

$automationAccount = Get-AzAutomationAccount `
  -Name "MY_AUTOMATION_ACCOUNT" `
  -ResourceGroupName "MY_RESOURCE_GROUP"

$connection = $automationAccount | Get-AzAutomationConnection -Name "AzureRunAsConnection"

# Log-in to Az Account Management Graph API (for DNS updates)
Login-AzAccount -ServicePrincipal `
  -Tenant $connection.FieldDefinitionValues.TenantID `
  -ApplicationId $connection.FieldDefinitionValues.ApplicationID `
  -CertificateThumbprint $connection.FieldDefinitionValues.CertificateThumbprint

但是,当我运行它时,我收到了这个错误:

Login-AzAccount : No certificate was found in the certificate store with thumbprint
93FAB7F0BA11D08F8ABBAF5C587C77ECB058A8BB

看来我需要导出AzureRunAsConnection正在使用的证书,以便可以将其导入本地计算机。但是,尽管我可以续订 Azure 自动化使用的证书或上传我自己的证书,但似乎没有一种简单的方法可以获取当前证书。我知道这是设计使然 - 出于安全考虑 - 但对于这样的情况,这是一种痛苦。

Get-AutomationCertificate我发现这篇 2018 年的文章描述了如何在混合工作人员中导出证书,但代码在 Azure Cloud Shell 和本地(未定义) 中对我不起作用: https ://www.lunavi.com/blog /how-to-download-an-azure-automation-connection-certificate-locally

网络上的一些指南建议创建一个 blob 存储帐户,然后编写一个脚本来导出到它,但这似乎需要付出很多努力,因为我只需要一次来进行此复制。

获得此证书以进行本地调试/复制的最快、最简单的方法是什么?

标签: azurepowershellazure-automationservice-principalrunbook

解决方案


最后,我使用 2018 年的文章制作了一种快速而肮脏的方法,以从运行手册中获取可消耗格式的证书。

我修改了运行手册中运行的脚本,在顶部添加了以下几行:

"*** Exporting Run As Certificate for Debugging"
$cert = Get-AutomationCertificate -Name "AzureRunAsCertificate"
$certData = $cert.Export("pfx", 'MySuperSecurePassword')

throw ([Convert]::ToBase64String($certData))

这会导致包含证书内容作为其消息的异常。然后,当我通过运行手册“测试窗格”运行此代码时,我会在顶部以 base64 格式导出证书的内容: Base64 编码格式的证书内容

我使用异常只是为了:1) 运行手册的其余部分不执行,以及 2) 我保证可以看到该消息。我发现如果我只是在抛出异常之前做了一个 Write-Host,那么在脚本停止运行之前输出可能不会被刷新。

然后,我可以复制括号中的 base64 编码部分,将其粘贴到文件中,然后[System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String在 PowerShell 或base64 --decodeWSL 中解码文件的内容以获取 PFX 文件。然后我可以打开该 PFX 文件并将其导入我的本地用户存储: 用于导入 PFX 的设置


推荐阅读