我有两种方法可以执行相同的操作,但是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);
我能够使用此证书成功托管和访问我的应用程序。
这种方法行不通,但我应该使用:
我将证书存储在Azure密钥保管库证书
中,并使用以下代码对其进行检索并创建X509Certificate2:
CertificateBundle certificateBundle = await keyVaultClient.GetCertificateAsync(keyVaultUrl, "MyCert-Certificate");
X509Certificate2 certFromCertificate = new X509Certificate2(certificateBundle.Cer);
此方法的问题在于证书不包含私钥。即certFromCertificate.HasPrivateKey为false。
我的问题
为什么certFromSecret没有私钥,而certFromCertificate没有私钥?
如何从密钥库中检索证书,在其中可以创建X509Certificate2对象以使用UseHttps将应用程序托管在Kestrel中。
我是这个主题的新手,希望能对您有所帮助。
答案 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,以了解为什么必须使用该机密来获得带有私钥的完整证书。