web-dev-qa-db-fra.com

Les certificats Azure Key Vault ne disposent pas de la clé privée lorsqu'ils sont récupérés via IKeyVaultClient.GetCertificateAsync

J'ai 2 approches pour faire la même chose, mais Azure a déprécié celle qui fonctionne et l'autre méthode ne fonctionne pas.

L'approche qui fonctionne, mais qui est déconseillée:

Je stocke mon PFX dans Azure Key Vault Secrets . (lorsque je crée le secret, je vois un avertissement indiquant que cette fonctionnalité est déconseillée)

et utilisez le code suivant pour le récupérer pour créer mon certificat:

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

crédits à cette réponse

Je peux utiliser ce certificat pour héberger et accéder à mon application avec succès.

L'approche qui ne fonctionne pas, mais je devrais utiliser:

Je stocke mon certificat dans le coffre Azure Key Certificats

et utilisez le code suivant pour le récupérer et créer le X509Certificate2:

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

Le problème avec cette approche est que le certificat ne contient pas la clé privée. c'est-à-dire que certFromCertificate.HasPrivateKey est faux.

Mes questions

Pourquoi certFromSecret possède la PrivateKey, alors que certFromCertificate n'en a pas?

Comment puis-je récupérer un certificat à partir du coffre de clés, où je peux créer un objet X509Certificate2 pour héberger mon application dans Kestrel avec UseHttps.

Je suis nouveau sur ce sujet et j'apprécierais donc toute aide.

11
Nandun

La 2ème partie de @ Adrian's réponse explique très bien les concepts autour des certificats Azure KV, et j'ai changé mon code comme ci-dessous pour obtenir le certificat complet, y compris les clés privées:

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

L'astuce consistait à utiliser GetSecretAsync au lieu de GetCertificateAsync. Veuillez vous référer à Adrian réponse SO pour voir pourquoi le secret a dû être utilisé pour obtenir le certificat complet avec des clés privées.

9
Nandun