微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

作为对我们的一个 Runbook 正在使用的服务主体的权限问题进行故障排除/诊断的一部分,Microsoft 支持要求我在本地运行相同的 PowerShell 代码,以便我们可以捕获日志。为此,我需要以与 Runbook 完全相同的方式进行身份验证,这意味着使用 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 存储帐户,然后编写一个脚本来导出到它,但这对于我只需要一次复制的东西来说似乎需要付出很多努力。

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

解决方法

最后,我使用 2018 年的文章设计了一种快速而肮脏的方法,从 Runbook 中以可消耗的格式获取证书。

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

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

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

这会导致包含证书内容作为其消息的异常。然后,当我通过运行手册“测试窗格”运行此代码时,我在顶部获得以 base64 格式转储的证书内容: The contents of the certificate in Base64-encoded format

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。