You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PowerShell在Azure Key Vault存储和检索SSH私钥

问题

是否存在一种正确的方法,可将RSA私钥存储在Azure Key Vault中,以便能使用PowerShell cmdlet(理想情况下为Az.KeyVault模块)在不同用户、不同设备上检索该密钥?

背景

我拥有一个用于连接外部SFTP服务的SSH私钥,希望将其存储在Azure Key Vault中,允许我的Azure Function在需要连接SFTP时读取该密钥。

最初我将该RSA私钥作为密钥上传,但发现获取时得到的是公钥的PEM信封,且值与上传的完全不同。

我找到一篇文章,介绍了如何使用AZ CLI将私钥作为机密而非密钥进行存储和检索,这正是我需要的方式。但由于我的Azure Function是用PowerShell编写的,我希望使用对应的PWSH cmdlet,不过这些cmdlet没有像CLI那样指定源文件的选项。

查阅文档时,我发现了使用PowerShell在Azure Key Vault中存储多行机密的方法,但该方法要求使用ConvertTo-SecureString,我认为这意味着该值只能由创建它的同一用户/机器组合解密,这对于Key Vault的大多数场景来说毫无意义(如果依赖机器,那为何不直接将机密存储在机器上),也无法实现从我的机器设置机密并供Azure Function使用的需求。

我当然可以将原始PEM中的换行符替换为其他分隔符(例如管道符),然后在检索机密时恢复,但这种方法感觉比较笨拙。

解决方案

存储RSA私钥到Key Vault

  1. 读取本地私钥PEM文件,保留所有原始换行:
$privateKeyContent = Get-Content -Path "C:\path\to\your\private-key.pem" -Raw
  1. 将明文内容转换为SecureString格式(使用-AsPlainText -Force仅做格式转换,不会触发本地绑定加密,Key Vault会负责全局加密存储):
$securePrivateKey = ConvertTo-SecureString -String $privateKeyContent -AsPlainText -Force
  1. 存入Key Vault:
Set-AzKeyVaultSecret -VaultName "your-key-vault-name" -Name "ssh-private-key" -SecretValue $securePrivateKey

跨环境检索RSA私钥

只要拥有Key Vault的机密读取权限,无论在本地机器还是Azure Function中,都可以用以下命令获取完整的原始私钥:

$secret = Get-AzKeyVaultSecret -VaultName "your-key-vault-name" -Name "ssh-private-key"
$privateKeyContent = [System.Net.NetworkCredential]::new("", $secret.SecretValue).Password

$privateKeyContent会包含带完整换行的PEM格式私钥,可直接用于SFTP连接。

关键澄清

你之前对ConvertTo-SecureString的理解有误:当搭配-AsPlainText -Force参数时,该命令只是将明文转换成PowerShell cmdlet要求的SecureString类型,不会用本地DPAPI加密内容,也不会绑定到当前用户或机器。Key Vault会对存入的机密进行独立加密,任何有权限的主体(比如Azure Function的托管标识)都能正常获取原始内容。

这种方法是官方推荐的多行机密存储方案,既符合PowerShell的要求,又能保证跨环境可用性,无需修改私钥的原始格式。

内容的提问来源于stack exchange,提问作者JohnLBevan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:32:53