获取上传到 Azure Key Vault Keys 的 pem 文件

tom*_*lex 1 azure azure-keyvault

我已经通过 azure 门户上传了一个pem文件,Azure Key Vault Keys并尝试使用以下功能来获取数据"azure-keyvault": "^3.0.0-preview",

client.getKey(vaultUri, keyName, keyVersion,  {maxresults : 10}, function(err, result)  {
    if (err) throw err;

    console.log(result,'-----------key-');   
})
Run Code Online (Sandbox Code Playgroud)

结果

{ key:
    { 
     kid: 'https://test.vault.azure.net/keys/test/1123123123lksldkf',
     kty: 'RSA',
     keyOps: [ 'sign', 'verify', 'wrapKey', 'unwrapKey', 'encrypt', 'decrypt' ],
     n: <Buffer  ... >,
     e: <Buffer > 
    },
    attributes: { enabled: true,
     created: 2016-02-09T08:48:27.000Z,
     updated: 2016-02-09T08:48:27.000Z,
     recoveryLevel: 'Purgeable'
    } 
} 
Run Code Online (Sandbox Code Playgroud)

我如何pem从下载文件result,非常感谢任何帮助。我对 azure Vault 非常陌生,并尝试使用keys, secrets and certificates.

Eag*_*Dev 6

将证书上传到密钥存储后,便无法从 Azure Key Vault 以证书文件(无论是 .pem 还是 .pfx)的形式下载密钥。Azure Key Vault 中的密钥专门用于签名/加密/解密操作。返回的 JSON 是 JWT(Json Web Token)的一种格式,它只包含您存储的密钥的公共部分。这基本上意味着无法将输出转换为 PEM 或 X.509 的形式。

使用Keys,您可以备份您的密钥,但备份也在 Azure Key Vault 中受到保护,您无法检索或请求获取密钥正文内容。如果您丢失密钥并想要恢复它,备份会很有帮助。

可能不在问题范围内,但我很想介绍

如果您将证书上传到证书存储中,则只能导出 x509 证书的 CER 内容并生成 .cer 文件。您不能导出包括私钥在内的完整密钥。

如果以机密形式将证书(例如 .pfx 文件)上传到 Azure Key Vault,则可以使用以下几种方法以编程方式将其下载到客户端:

  • GetSecretAsyn()
  • 调用 KeyVault REST API

这两种方式都需要秘密标识符和访问令牌(Azure Active Directory 为您提供)。然后,您需要将返回值从 Base64 转换为字节,并以.pfx文件的形式将其写入客户端。

下面是我在异步模式下使用 HttpClient 生成我上传的 PFX 文件的示例代码(来自 Secrets 商店)

    public static async Task<string> GetSecret(HttpClient client)
    {
        string url = $"/secrets/cert01?api-version=2016-10-01";

        using (var httpResponse = await client.GetAsync(url))
        {
            httpResponse.EnsureSuccessStatusCode();
            string responsContent = await httpResponse.Content.ReadAsStringAsync();
            JObject jsonKv = JObject.Parse(responsContent);
            string secretBody = jsonKv["value"].ToString();
            return secretBody;
        }
    }

    public static async Task ExportPfx()
    {
        string filePath = @"test02.pfx";

        var key = await GetSecret();
        byte[] encodedText = Encoding.Unicode.GetBytes(key);
        using (FileStream sourceStream = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true))
        {
            await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
        }

    }
Run Code Online (Sandbox Code Playgroud)

导出证书后,将其导入本地机器并验证其是否具有相同的指纹和其他规格。

注意:从 Key Vault 导出的证书(作为机密)没有密码,即使您在上传到 Secret 存储时设置了密码