作者:手机用户2502856985 | 来源:互联网 | 2022-12-10 05:30
如何解决《通过IKeyVaultClient.GetCertificateAsync检索时,AzureKeyVault证书没有私钥》经验,为你挑选了1个好方法。
我有两种方法可以执行相同的操作,但是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().Single(s => s.HasPrivateKey);
归功于这个答案
我可以使用此证书成功托管和访问我的应用程序。
该方法不起作用,但我应该使用:
我将证书存储在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> Nandun..:
@Adrian的答案的第二部分很好地解释了Azure KV证书的概念,并且我更改了以下代码以获取包括私钥在内的完整证书:
SecretBundle secret = await kv.GetSecretAsync(keyVaultUrl, certName);
X509Certificate2 certificate = new X509Certificate2(Convert.FromBase64String(secret.Value));
诀窍是使用GetSecretAsync而不是GetCertificateAsync。请参阅Adrian的SO答案,以了解为什么必须使用该机密来获取带有私钥的完整证书。