如何从Azure Key Vault KeyBundle创建X509Certificate2对象

时间:2016-05-04 16:17:34

标签: c# .net azure x509 azure-keyvault

我使用Azure Key Vault来保护我们的密钥和机密,但我不确定如何使用我使用.net SDK检索的KeyBundle。如何创建X509Certificate2对象?

4 个答案:

答案 0 :(得分:10)

在KeyVault中导入/创建证书时,会创建3个实体:

  • 证书 - 包含证书的所有相关详细信息,包括其公开部分(即公钥,有效期,指纹等)

  • 秘密 - 包含base64中的私钥(证书的私有部分)

  • Key - 我不知道,但与此线程无关。

您可以使用Certificate对象或Secret对象创建X509Certificate2对象。

如果您希望X509Certificate2包含私钥,那么当然您需要获取Secret实体的值并执行以下操作:

SecretBundle certificatePrivateKeySecretBundle =
    await keyVaultClient.GetSecretAsync(certificateIdentifierSecretPart);

byte[] privateKeyBytes = Convert.FromBase64String(certificatePrivateKeySecretBundle.Value);
X509Certificate2 certificateWithPrivateKey = new X509Certificate2(privateKeyBytes, (string) null, X509KeyStorageFlags.MachineKeySet);

certificateIdentifierSecretPart等于证书的秘密部分路径: https://<vault name>.vaults.azure.net/secrets/<certificate name>

请注意 / secrets / 路径。

答案 1 :(得分:3)

2020年11月更新:

在当前版本的Azure Key Vault中,Certificates 是一流的概念,而不是秘密。

如果您的Key Vault实例已经具有带有可导出私钥的证书,则可以按以下步骤获取并充填X509Certificate2

使用DefaultAzureCredential

创建所需的客户端
var certClient = new CertificateClient(new Uri("https://yourKeyVault.vault.azure.net/"), new DefaultAzureCredential());
var secretClient = new SecretClient(new Uri("https://yourKeyVault.vault.azure.net/"), new DefaultAzureCredential());

获取证书,其中包括指向私钥机密的链接。

注意:Key Vault Secrets库的最新版本(4.2.0 beta)包括一个名为KeyVaultSecretIdentifier的帮助程序类,可以为您进行解析。

Response<KeyVaultCertificateWithPolicy> certResponse = await certClient.GetCertificateAsync("testCert");

// Get the secretId and parse out the parts needed to fetch the secret.
Uri secretId = certResponse.Value.SecretId;
var segments = secretId.Segments;
string secretName = segments[2].Trim('/');
string version = segments[3].TrimEnd('/');

获取证书的机密并使用它来构建新的X509Certificate2

Response<KeyVaultSecret> secretResponse = await secretClient.GetSecretAsync(secretName, version);

KeyVaultSecret secret = secretResponse.Value;
byte[] privateKeyBytes = Convert.FromBase64String(secret.Value);

var cert = new X509Certificate2(privateKeyBytes);

有关最新的Key Vault证书和密钥客户端的更多信息,请参见此处各自的README文档:

Azure.Security.KeyVault.Certificatesmigration guide from the old version

Azure.Security.KeyVault.Secretsmigration guide from the old version

答案 2 :(得分:1)

您不能将KeyBundle结果用作X509Certificate2对象,因为它只是表示密钥对的公钥部分(无发行者)。请参阅KeyVaultClientExtensions中的方法,了解使用此KeyBundle对象加密数据,验证签名等功能。

答案 3 :(得分:0)

当使用新的 Azure.Security.KeyVault.* 库并在 Christopher Scott 回答的基础上进行构建时,您可以加载所有活动和未过期版本并跳过 GetCertificate 和解析步骤,如下所示:< /p>

public static IEnumerable<X509Certificate2> LoadCertificateVerisons(
    string keyVaultName,
    string certificateName)
{
    var keyVaultUrl = new Uri($"https://{keyVaultName}.vault.azure.net");
    var certificateClient = new CertificateClient(keyVaultUrl, new AzureCliCredential());
    var secretClient = new SecretClient(keyVaultUrl, new AzureCliCredential());

    var versions = certificateClient.GetPropertiesOfCertificateVersions(certificateName).ToArray();

    foreach (var certificate in versions)
    {
        if (!certificate.Enabled.GetValueOrDefault(false) ||
            certificate.ExpiresOn <= DateTimeOffset.UtcNow) continue;

        var certificateSecret = secretClient.GetSecret(certificate.Name, certificate.Version).Value;
        var privateKey = Convert.FromBase64String(certificateSecret.Value);
        yield return new X509Certificate2(privateKey, (string) null, X509KeyStorageFlags.MachineKeySet);
    }
}