azure - 使用自定义脚本扩展从 Azure Key Vault 下载证书
问题描述
我正在使用 python 创建一个 VM,并使用自定义脚本扩展来下载 VM 内的证书,然后将其保存在本地计算机证书受信任的根证书中。
我唯一的查询是在网络上,可用于从 Azure Key Vault 下载证书的资源非常有限。大家建议先登录再使用cmdlet下载,对于自定义脚本扩展是不合适的。
以下是要求登录然后下载证书的示例 powershell cmdlet。但是当我们运行自定义脚本扩展时,我们将无法进行身份验证。
$vaultName = "YOUR-KEYVAULT-NAME"
$certificateName = "YOUR-CERTIFICATE-NAME"
$pfxPath = [Environment]::GetFolderPath("Desktop") + "\$certificateName.pfx"
$password = "YOUR-CERTIFICATE-PASSWORD"
$pfxSecret = Get-AzureKeyVaultSecret -VaultName $vaultName -Name $certificateName
$pfxUnprotectedBytes = [Convert]::FromBase64String($pfxSecret.SecretValueText)
$pfx = New-Object Security.Cryptography.X509Certificates.X509Certificate2
$pfx.Import($pfxUnprotectedBytes, $null, [Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
$pfxProtectedBytes = $pfx.Export([Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $password)
[IO.File]::WriteAllBytes($pfxPath, $pfxProtectedBytes)
解决方案
您可以在 azure ad 中创建一个 AD 应用程序,并使用服务主体以非交互方式登录。
请按照以下步骤操作:
1.创建一个Azure Active Directory应用并为该应用创建一个secret ,自己保存secret并获取登录值。
2.在门户中导航到您的keyvault -> Access policies
-> Add new
-> Select principal
(只需搜索您的AD App的名称,如果您创建AD App,它将自动在您的租户中创建一个服务主体)->选择正确的Secret/Key/Certificate permissions
(这取决于您将要执行的操作,在这种情况下,您需要在 中选择Get
,Secret permissions
也可以轻松选择全部) -> 单击OK
-> Save
。
3.这时服务主体就有了运行的权限Get-AzureKeyVaultSecret
,你只需要使用它非交互方式登录即可。
$azureAplicationId ="Azure AD Application Id"
$azureTenantId= "Your Tenant Id"
$azurePassword = ConvertTo-SecureString "your AD App secret" -AsPlainText -Force
$psCred = New-Object System.Management.Automation.PSCredential($azureAplicationId , $azurePassword)
Add-AzureRmAccount -Credential $psCred -TenantId $azureTenantId -ServicePrincipal
Get-AzureKeyVaultSecret -VaultName $vaultName -Name $certificateName
推荐阅读
- python - 函数和参数问题 | 无法使用 python 脚本发送命令并连接到网络设备?
- c# - 如何使用 Selenium 获取标签的文本
- python - 如何将 IP 循环集成到我的网络抓取程序中?我一直被 Crunchbase 屏蔽
- c++ - 致命错误:glew.h:使用 make 时没有这样的文件或目录
- vue.js - 在 vuejs 中访问数据对象
- c - 处理目录更改中的错误
- javascript - 如何通过 api 获取数据并用它渲染子组件 - 响应谷歌地图
- python - 使用 .format 构造表达式时出现 KeyError
- google-cloud-automl - 无法为 AutoML 实体提取 NLP 上传训练数据
- python - 有没有办法在特定列表中动态插入值?