Не удалось получить сертификат из хранилища ключей - PullRequest
2 голосов
/ 17 марта 2020

Я использую функцию app для получения сертификата хранилища ключей, но получаю исключение, как показано ниже:

Системе не удается найти указанный файл
в System.Security.Cryptography.CryptographicException Исключение .X509Certificate. CertificateHelper.GetKeyVaultCertificate (String keyvaultName, String name)
в DWP.CDA.FunctionApp.ProcessRequest.Run (JObject eventGridEvent, журнал TraceWriter)

Это хорошо работает в моей локальной визуальной студии, так как я использую мой собственный аккаунт, чтобы получить azure сервис Аутентификация. Я даю полный доступ к своей учетной записи и получаю доступ к функции приложения в политиках доступа к хранилищу ключей

Вот мой код получения сертификата:

internal static X509Certificate2 GetKeyVaultCertificate(string keyvaultName, string name)
        {
            var serviceTokenProvider = new AzureServiceTokenProvider();
            var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(serviceTokenProvider.KeyVaultTokenCallback));

            // Getting the certificate
            var secret = keyVaultClient.GetSecretAsync("https://" + keyvaultName + ".vault.azure.net/", name);

            // Returning the certificate
            return new X509Certificate2(Convert.FromBase64String(secret.Result.Value));
        }

1 Ответ

2 голосов
/ 17 марта 2020

Я использую тот же код с вашим, и он не показывает сообщение об ошибке (как на локальном, так и на azure портале). Я редактирую его в Visual Studio, код, показанный ниже:

namespace FunctionApp7
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            var serviceTokenProvider = new AzureServiceTokenProvider();
            var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(serviceTokenProvider.KeyVaultTokenCallback));

            // Getting the certificate
            var secret = keyVaultClient.GetSecretAsync("https://***.vault.azure.net/", "***");


            var certificate = new X509Certificate2(Convert.FromBase64String(secret.Result.Value));

            log.LogInformation(certificate.ToString());

            return new OkObjectResult("success");
        }
    }
}

Он отлично работает в Visual Studio, а также отлично работает при развертывании из Visual Studio на портале azure.

Вот сообщение , в котором упоминается решение, которое вы также можете попробовать. В сообщении сообщается нам

Если вы включите этот код в основной проект ASP. NET и запустите его локально, он будет работать, как и ожидалось. Но если вы развернете его в Azure (как веб-приложение или Azure функция), вы получите следующее исключение: The system cannot find the file specified

Решение:

var certificate = new X509Certificate2(Convert.FromBase64String(secret.Value), 
                    (string)null, 
                    X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

Надеюсь, это поможет ~

...