#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, иначе вы получите сообщение об ошибке, в котором указано, что функция импорта не смогла найти файл. Проверьте этот источник.