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

时间:2018-07-21 00:46:42

标签: ssl tls1.2 x509certificate2 azure-keyvault kestrel-http-server

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

有效但不建议使用的方法:

我将我的PFX存储在Azure Key Vault 秘密中。 (当我创建机密时,我会看到一条警告,指出该功能已过时)

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

        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);

贷记this answer

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

这种方法行不通,但我应该使用:

我将证书存储在Azure密钥保管库证书

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

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

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

我的问题

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

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

我是这个主题的新手,希望能对您有所帮助。

1 个答案:

答案 0 :(得分:6)

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

        SecretBundle secret = await kv.GetSecretAsync(keyVaultUrl, certName);
        X509Certificate2 certificate = new X509Certificate2(Convert.FromBase64String(secret.Value));

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