2021 年,fastest/easiest 导出 Azure Automation AzureRunAsConnection 用于本地调试的证书的方式是什么?

In 2021, what is the fastest/easiest way to export the certificate used by an Azure Automation AzureRunAsConnection for local debugging?

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

将一些仅存在于 Azure 自动化中的 cmdlet 换成 Azure RM 的等效命令后(例如 Get-AutomationConnection 必须替换为 Get-AzAutomationAccountGet-AzAutomationConnection,并且您必须切换到使用 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 自动化使用的证书或上传我自己的证书,但似乎没有一种简单的方法来获取当前证书。我知道这是设计使然——为了安全——但对于像这样的情况,这很痛苦。

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

网络上的一些指南建议创建一个 blob 存储帐户,然后编写一个脚本来导出到它,但这似乎需要付出很多努力才能完成此重现。

为本地 debugging/repro 获取此证书的最快、最简单的方法是什么?

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

我修改了 运行ning 在 运行book 中的脚本,在顶部添加以下行:

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

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

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

我使用异常只是为了:1) 运行本书的其余部分不会执行,并且 2) 我保证能看到消息。我发现如果我只是在抛出异常之前执行 Write-Host,则在脚本停止之前可能不会刷新输出 运行ning。

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