web-dev-qa-db-ja.com

IKeyVaultClient.GetCertificateAsyncを介して取得したとき、Azure Key Vault証明書には秘密キーがありません

私は同じことを行う2つの方法を持っていますが、Azureは機能する方法を廃止し、もう1つの方法は機能しません。

機能するが非推奨のアプローチ:

PFXをAzure Key VaultSecretsに保存します。 (シークレットを作成すると、この機能が廃止されたことを示す警告が表示されます)

次のコードを使用して取得し、証明書を作成します。

        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 Key Vaultに保存しますCertificates

次のコードを使用してそれを取得し、X509Certificate2を作成します。

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

このアプローチの問題は、証明書に秘密鍵が含まれていないことです。つまり、certFromCertificate.HasPrivateKeyがfalseです。

私の質問

CertFromSecretにPrivateKeyがあるのに、certFromCertificateにはないのはなぜですか?

KeyVaultから証明書を取得するには、X509Certificate2オブジェクトを作成して、UseHttpsを使用してアプリケーションをKestrelでホストします。

私はこのトピックに不慣れなので、どんな助けにも感謝します。

11
Nandun

@Adrianの2番目の部分 answer は、Azure KV証明書に関する概念を非常によく説明しています。プライベートキーを含む完全な証明書を取得するために、コードを以下のように変更しました。

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

コツは、GetCertificateAsyncの代わりにGetSecretAsyncを使用することでした。 Adrianの SO answer を参照して、秘密キーを含む完全な証明書を取得するためにシークレットを使用する必要がある理由を確認してください。

9
Nandun