Не удается найти сертификат - Azure. NET Базовое приложение - PullRequest
0 голосов
/ 30 апреля 2020

Когда я запускаю свое веб-приложение из Azure, я получаю исключение о том, что он не может найти мой сертификат.

  1. Я настроил KeyVault для хранения своих секретов и загрузил свой сертификат закрытого ключа в настройки TLS / SSL.
  2. В Azure Active Directory Я зарегистрировал свой приложение, которое имеет тот же отпечаток, что и мой сертификат закрытого ключа.
  3. В конфигурации моего веб-приложения я добавил "WEBSITE_LOAD_CERTIFICATES" = "*" и "KeyVault: Vault" = "meiwebapivault"
  4. Затем в коде мой Program.cs обрабатывает поиск сертификата. Однако это - то, где это терпит неудачу.

Любая идея, какие шаги я пропускаю или почему это терпит неудачу?

Я следовал этому учебнику .

KeyVault - Secrets

Azure Active Directory - App Registration

Uploaded certificate

webApp TSL/SSL Settings - private certificate

Configuration - App Settings

public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration(builder =>
                {
                    var root = builder.Build();
                    var vaultName = root["KeyVault:Vault"];
                    if (!string.IsNullOrEmpty(vaultName))
                    {
                        builder.AddAzureKeyVault($"https://{vaultName}.vault.azure.net/",
                            root["KeyVault:ClientId"],
                            GetCertificate(root["KeyVault:Thumbprint"]),
                            new PrefixKeyVaultSecretManager("WebApi"));
                    }
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

        private static X509Certificate2 GetCertificate(string thumbprint)
        {
            var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            try
            {
                store.Open(OpenFlags.ReadOnly);
                var certificateCollection = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, true);

                if (certificateCollection.Count == 0)
                    throw new Exception("Certificate is not installed"); //<------------- FAILS HERE

                return certificateCollection[0];
            }
            finally
            {
                store.Close();
            }
        }
    }
{
  "KeyVault": {
    "Vault": "",
    "ClientId": "6ac#####-####-####-####-######ffe96",
    "Thumbprint": "4EC2C##############################4507C"
  },
public class PrefixKeyVaultSecretManager : IKeyVaultSecretManager
    {
        private readonly string _prefix;

        public PrefixKeyVaultSecretManager(string prefix)
        {
            _prefix = $"{prefix}-";
        }
        public string GetKey(SecretBundle secret)
        {
            return secret.SecretIdentifier.Name.Substring(_prefix.Length)
                .Replace("--", ConfigurationPath.KeyDelimiter);
        }

        public bool Load(SecretItem secret)
        {
            return secret.Identifier.Name.StartsWith(_prefix);
        }
    }

1 Ответ

0 голосов
/ 01 мая 2020

Моя настройка была правильной. Мне просто нужно было изменить эту строку с

var certificateCollection = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, true);

на

var certificateCollection = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...