Я пытаюсь получить доступ к секретам в своем хранилище ключей Azure из виртуальных машин, работающих в моем пуле узлов Azure.
Однако я продолжаю сталкиваться с исключением:
Сообщение об исключении: Пробовал 1 сертификат (ы).Не удалось получить токен доступа.
Исключение для сертификата № 1 с отпечатком большого пальца. MY-THUMBPRINT: Набор ключей не существует
До сих пор я следил заинструкции, изложенные здесь: https://docs.microsoft.com/en-us/azure/key-vault/service-to-service-authentication
В статье описывается сценарий пакетной службы Azure и указывается, что мне следует использовать принципала службы.Я хочу убедиться, что в управлении версиями нет секретов или ключей, поэтому я использую первый метод сертификата в локальном хранилище ключей для входа в Azure AD.
Локальный запуск всего нижеприведенного как исполняемый файлнормально, но завершается неудачно при запуске на узле пакетного пула Azure.
На этом шаге я пока проделал следующие шаги:
Создание участника службы и связанного сертификата в keyvault: 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).
Мой пакет приложений, работающий в AzureBatch - это простой консольный исполняемый файл.Для 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);
Все работает хорошо локально, но на удаленном узле происходит сбой.Я могу выполнить RDP в узел пакетной службы Azure и увидеть, что сертификат установлен для локального компьютера.
Мне интересно, как устранить мою ошибку или мои действия, описанные выше, каким-то образом неверны?