2021年导出Azure Automation AzureRunAsConnection证书用于本地调试的最快方法
问题场景
- 排查某Runbook使用的服务主体权限问题时,微软支持团队要求在本地运行相同PowerShell代码捕获日志。为了完全对齐Runbook的身份验证逻辑,需要使用
AzureRunAsConnection绑定的证书完成认证。 - 已将Azure Automation专属cmdlet替换为等效Az命令(比如把
Get-AutomationConnection替换为Get-AzAutomationAccount+Get-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出于安全设计的限制,但对临时排查的场景非常不便)。 - 之前参考的Hybrid Worker环境导出证书的旧方法无法在Cloud Shell、本地环境运行(提示
Get-AutomationCertificate未定义);网络上推荐的导出到Blob存储的方案对单次复现的场景来说操作量过大。
最快落地解决方案
- 不需要搭建Blob存储、不需要改造现有RunAs连接配置,全流程核心逻辑是利用Runbook运行时的内置权限直接导出证书内容,操作步骤如下:
- 在目标自动化账号下创建一个临时的PowerShell Runbook,写入以下导出证书的代码:
# 获取RunAs连接信息 $runAsConn = Get-AutomationConnection -Name "AzureRunAsConnection" # 自动化账号内的RunAs证书资源命名规则为证书指纹的前10位字符 $certThumbprintPrefix = $runAsConn.CertificateThumbprint.Substring(0,10) $cert = Get-AutomationCertificate -Name $certThumbprintPrefix # 将证书转为无密码PFX的Base64编码,直接输出到作业流 $certBytes = $cert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12) $base64Cert = [Convert]::ToBase64String($certBytes) Write-Output "START_CERT_BASE64" Write-Output $base64Cert Write-Output "END_CERT_BASE64" - 保存并发布这个临时Runbook,启动作业运行。等作业执行完成后,直接在作业的输出日志里,复制
START_CERT_BASE64和END_CERT_BASE64标记中间的全部Base64字符串 - 本地打开PowerShell,执行以下代码将复制的Base64内容转回证书对象,导入当前用户的个人证书存储:
# 替换引号内为刚才复制的完整Base64字符串 $base64Input = "粘贴从Runbook输出的Base64内容" $certBytes = [Convert]::FromBase64String($base64Input) $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2( $certBytes, "", [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::DefaultKeySet ) # 导入到本地证书存储 $cert | Import-Certificate -CertStoreLocation "Cert:\CurrentUser\My" - 导入完成后重新运行之前编写的本地认证脚本,即可完全对齐Runbook内的证书认证逻辑,正常完成登录。
- 在目标自动化账号下创建一个临时的PowerShell Runbook,写入以下导出证书的代码:
- 操作注意事项:
- 整个流程仅需要对现有自动化账号有Runbook创建权限即可,不需要额外配置存储、跨权限访问规则,全流程10分钟以内即可完成
- 排查完成后可以直接删除临时创建的Runbook,不会对现有自动化账号的配置造成任何影响
- 导出的证书为无密码PFX格式,本地导入后注意妥善保管,排查结束可以及时从本地证书存储中删除该证书,避免安全风险
内容的提问来源于stack exchange,提问作者GuyPaddock
相关产品推荐
相关产品推荐

