Я пытаюсь получить доступ к секретам в моем хранилище ключей Azure с виртуальных машин, работающих в моем пуле узлов пакетной службы Azure.
Однако я продолжаю сталкиваться с исключением:
Сообщение об исключении: проверено 1 сертификат (а). Не удалось получить токен доступа.
Исключение для сертификата №1 с отпечатком MY-THUMBPRINT: набор ключей не существует
До сих пор я следовал инструкциям, изложенным здесь: https://docs.microsoft.com/en-us/azure/key-vault/service-to-service-authentication
В статье описывается сценарий пакетной службы Azure и указывается, что мне следует использовать субъект-службу. Я хотел бы убедиться, что в системе управления версиями нет секретов или ключей, поэтому я использую первый метод сертификата в локальном хранилище ключей для входа в Azure AD.
Выполнение всего перечисленного ниже локально в качестве исполняемого файла работает нормально, но не выполняется при запуске на узле пула пакетной службы Azure.
На данный момент я сделал следующие шаги:
Создайте субъект-службу и связанный сертификат в хранилище ключей:
az ad sp create-for-rbac --name myserviceprincipal --create-cert --cert mycertname --keyvault mykeyvaultname
. Сохраните идентификатор приложения-участника-службы и идентификатор клиента для использования в AzureServicesAuthConnectionString.Создайте политику доступа к хранилищу ключей для созданного субъекта-службы (выполняется в пользовательском интерфейсе портала Azure).
Загрузите созданный сертификат в формате PFX / PEM (выполняется в пользовательском интерфейсе портала Azure).
Обеспечение пароля PFX в сертификате (я делаю это, поскольку для загрузки сертификата в пакет Azure на шаге 6 требуется связанный пароль): https://coombes.nz/blog/azure-keyvault-export-certificate/
# Replace these variables with your own values
$vaultName = "YOUR-KEYVAULT-NAME"
$certificateName = "YOUR-CERTIFICATE-NAME"
$pfxPath = [Environment]::GetFolderPath("Desktop") + "\$certificateName.pfx"
$password = "YOUR-CERTIFICATE-PASSWORD"
$pfxSecret = Get-AzureKeyVaultSecret -VaultName $vaultName -Name $certificateName
$pfxUnprotectedBytes = [Convert]::FromBase64String($pfxSecret.SecretValueText)
$pfx = New-Object Security.Cryptography.X509Certificates.X509Certificate2
$pfx.Import($pfxUnprotectedBytes, $null, [Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
$pfxProtectedBytes = $pfx.Export([Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $password)
[IO.File]::WriteAllBytes($pfxPath, $pfxProtectedBytes)
Установка сертификата локально в хранилище LocalMachine моего компьютера (для локального тестирования).
Отправка сертификата в пакетную службу Azure (с помощью загрузки пользовательского интерфейса портала Azure).
Связывание сертификата с соответствующим пулом узлов и перезагрузка узлов (пока используется пользовательский интерфейс портала Azure).
Пакет моего приложения, работающий в пакетной службе Azure, представляет собой простой исполняемый файл консоли. Для AzureServicesAuthConnectionString
установлено значение RunAs=App;AppId={AppId};TenantId={TenantId};CertificateThumbprint={Thumbprint};CertificateStoreLocation={LocalMachine}
, а оставшийся код хранилища ключей для получения секрета выглядит так:
Environment.SetEnvironmentVariable("AzureServicesAuthConnectionString", "RunAs=App;AppId=<MY-APP-ID>;TenantId=<MY-TENANT>;CertificateThumbprint=<MY-THUMBPRINT>;CertificateStoreLocation=LocalMachine");
AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider(Environment.GetEnvironmentVariable("AzureServicesAuthConnectionString"));
KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
var secret = await keyVaultClient.GetSecretAsync("<MY-SECRET>").ConfigureAwait(false);
var message = secret.Value;
Console.WriteLine(message);
Локально все работает нормально, но не работает на удаленном узле. Я могу подключиться к узлу пакетной службы Azure по протоколу RDP и увидеть, что сертификат был установлен для локального компьютера.
Мне интересно, как исправить мою ошибку, или если мои шаги в чем-то неправильны?