通过IKeyVaultClient.GetCertificateAsync检索时,Azure Key Vault证书没有私钥

Nan*_*dun 5 ssl x509certificate2 tls1.2 azure-keyvault kestrel-http-server

我有两种方法可以执行相同的操作,但是Azure已弃用了一种可行的方法,而另一种方法则无效。

可行但不建议使用的方法:

我将PFX存储在Azure Key Vault Secrets中。(当我创建密码时,我会看到一条警告,指出该功能已被弃用)

并使用以下代码对其进行检索以创建我的证书:

        SecretBundle secret = await keyVaultClient.GetSecretAsync(keyVaultUrl, "MyCert-Secret");
        X509Certificate2Collection exportedCertCollection = new X509Certificate2Collection();
        exportedCertCollection.Import(Convert.FromBase64String(secret.Value));
        X509Certificate2 certFromSecret = exportedCertCollection.Cast<X509Certificate2>().Single(s => s.HasPrivateKey);
Run Code Online (Sandbox Code Playgroud)

归功于这个答案

我可以使用此证书成功托管和访问我的应用程序。

该方法不起作用,但我应该使用:

我将证书存储在Azure密钥库证书中

并使用以下代码进行检索并创建X509Certificate2:

        CertificateBundle certificateBundle = await keyVaultClient.GetCertificateAsync(keyVaultUrl, "MyCert-Certificate");
        X509Certificate2 certFromCertificate = new X509Certificate2(certificateBundle.Cer);
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于证书不包含私钥。即certFromCertificate.HasPrivateKey为false。

我的问题

为什么certFromSecret没有私钥,而certFromCertificate没有私钥?

我如何从密钥库中检索证书,在其中可以创建X509Certificate2对象以使用UseHttps将应用程序托管在Kestrel中。

我是这个主题的新手,所以我将不胜感激。

Nan*_*dun 9

@Adrian的答案的第二部分很好地解释了Azure KV证书的概念,并且我更改了以下代码以获取包括私钥在内的完整证书:

        SecretBundle secret = await kv.GetSecretAsync(keyVaultUrl, certName);
        X509Certificate2 certificate = new X509Certificate2(Convert.FromBase64String(secret.Value));
Run Code Online (Sandbox Code Playgroud)

诀窍是使用GetSecretAsync而不是GetCertificateAsync。请参阅Adrian的SO答案,以了解为什么必须使用该机密来获取带有私钥的完整证书。

  • 非常感谢您在此处发布此答案。您引用的答案仅包含 Power Shell 代码,而这是在干净的 C# 中。Microsoft 必须在文档中明确说明 GetCertificateAsync() 方法不会从保险库中检索有用的证书。 (4认同)

jas*_*per 9

最新版本的 SDK (Azure.Security.KeyVault.Certificates 4.2.0) 现在具有DownloadCertificateAsync方法,该方法可以以简单的方式获取完整的证书(即私钥)。

文档指出:

由于 Cer 仅包含公钥,因此此方法尝试下载包含完整证书的托管机密。

X509Certificate2 cert = await certificateClient.DownloadCertificateAsync(certName);

  • 托管标识需要哪些 RBAC 权限才能调用该方法?我可以让它与“Key Vault 证书官员”一起工作,但我对授予我的托管身份对证书的写入访问权限感到有点难过。您知道我是否可以让它在任何级别的只读访问权限下工作吗?(“读者”还不够。) (2认同)