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

