Ссылка на хранилище функциональных ключей Azure для сертификатов?

#azure-functions #azure-web-app-service #azure-keyvault

#azure-функции #azure-web-app-service #azure-keyvault

Вопрос:

Я пытаюсь использовать ссылки на хранилища ключей в моей функции Azure (v1), как описано здесь . Он отлично работает для секретов, но не для сертификатов.

В документах вообще не упоминаются сертификаты, так что, возможно, они просто не поддерживаются? Я надеялся получить его в виде строки base64.

Пример настройки приложения, который я использую: @Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/certificates/ApiClientAuthenticationCertificate/f9580a1f5a0c4a6ca65ea089976ca2b0)

Ответ №1:

Оказывается, сертификат доступен по /secrets пути. Мой пример выше должен выглядеть так: @Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/ApiClientAuthenticationCertificate/f9580a1f5a0c4a6ca65ea089976ca2b0) .

Тогда значением параметра будет строка сертификата base64 в формате PFX. Создайте экземпляр таким образом в своей функции Azure:

 byte[] certBytes = Convert.FromBase64String(base64Pfx);
var cert = new X509Certificate2();
cert.Import(certBytes, String.Empty, X509KeyStorageFlags.MachineKeySet);
  

Комментарии:

1. Будет ли это работать для локальной разработки (конфигурация в local.settings.json)?

2. @cameron Нет, локальная разработка не имеет доступа к хранилищу ключей Azure, поскольку управляемое удостоверение доступно только после размещения в Azure. Для локальной разработки считывайте данные непосредственно из файла PFX с помощью функции импорта сертификата. Чтобы узнать, выполняется ли я локально или в облаке Azure, я использую простое значение конфигурации (например, «ExecutionEnvironment» =»cloud» или «local»)

Ответ №2:

Я использую самозаверяющий сертификат для подключения к SharePoint с использованием разрешений приложения.

Ссылка на значение хранилища ключей в конфигурации задается следующим образом:

@Microsoft.KeyVault(SecretUri=https://keyvaultname.vault.azure.net/certificates/NameOfMyCertificate/id)

Секретный Uri легко получить из хранилища ключей. Он называется идентификатором сертификата и находится в свойствах сертификата в Azure Key Vault.

Чтобы функция Azure могла получить доступ к сертификату в хранилище ключей, у нее должна быть активирована управляемая идентификация и соответствующая политика доступа для получения сертификатов.

Значение, которое загружается в переменную конфигурации, действительно является строкой base64. Код, который я использовал для загрузки сертификата, выглядит следующим образом:

 public static X509Certificate2 ReadCertificateFromBase64StringPfx(string base64Pfx)
    {
        byte[] certBytes = Convert.FromBase64String(base64Pfx);
        X509Certificate2Collection collection = new X509Certificate2Collection();
        collection.Import(certBytes, string.Empty, X509KeyStorageFlags.PersistKeySet);
        return collection[0];  
    }
  

Если у вас более одного сертификата в PFX, вам нужно будет изменить возвращаемое значение и выбрать соответствующий сертификат из коллекции.

ПРИМЕЧАНИЕ: вы также должны добавить WEBSITE_LOAD_USER_PROFILE=1 в конфигурацию вашей функции Azure, иначе вы получите сообщение об ошибке, в котором указано, что функция импорта не смогла найти файл. Проверьте этот источник.