Azure: подключение к хранилищу ключей от облачного работника через сертификат - PullRequest
0 голосов
/ 09 января 2019

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

Управляемые удостоверения не доступны для классических облачных работников, поэтому я смотрю на сертификаты. Я получил аутентификацию по сертификатам для локальной работы, создав сертификат и загрузив его в Azure Active Directory для регистрации моего приложения:

Создание сертификата:

New-SelfSignedCertificate -Subject "CN=MyFineCertificate" -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature

Код, который использует его для подключения к хранилищу ключей (работает локально):

private static KeyVaultClient GetClient()
{
    var certificate = GetCertificate();
    var assertion = new ClientAssertionCertificate(clientId, certificate);
    var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback((a, r, s) => GetAccessTokenUsingCert(a, r, s, assertion)));
    return client;
}

private static X509Certificate2 GetCertificate()
{
    var certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
    certStore.Open(OpenFlags.ReadOnly);
    var results = certStore.Certificates.Find(/* criteria */);
    return results[0];
}

private static async Task<string> GetAccessToken(string authority, string resource, string scope, ClientAssertionCertificate cert)
{
    var authContext = new AuthenticationContext(authority, TokenCache.DefaultShared);
    var result = await authContext.AcquireTokenAsync(resource, cert);
    return result.AccessToken;
}

Пока все хорошо. Однако я хочу, чтобы мой облачный рабочий Azure делал это, поэтому мне нужен мой сертификат. Моим наивным предположением было то, что я мог с панели «Сертификаты» для моего облачного работника на портале загрузить сертификат (pfx).

К сожалению, мой облачный рабочий не может его найти. Если я запускаю это в Azure, после загрузки моего сертификата он не отображается:

foreach (StoreName name in Enum.GetValues(typeof(StoreName)))
{
    foreach (StoreLocation location in Enum.GetValues(typeof(StoreLocation)))
    {
        var certStore = new X509Store(name, location);
        certStore.Open(OpenFlags.ReadOnly);
        foreach (var res in certStore.Certificates)
        {
            /* log certificate */
        }
    }
}

Почему он не появляется? Я даже на правильном пути, или я совершенно не понял, как это работает?

1 Ответ

0 голосов
/ 09 января 2019

Ваш вопрос состоит из двух частей:

  1. Подход - Поскольку идентификация управляемого сервиса недоступна в облачных сервисах, как работать / проходить проверку подлинности с помощью Azure Key Vault?

    Вы на правильном пути. Я описал подход к аналогичной проблеме для работы с Key Vault в этой публикации SO - Защита конфиденциальной информации в конфигурации облачной службы Azure

  2. Реализация - в частности, как получить доступ к самоподписанному сертификату из экземпляра роли облачной службы.

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

    CSCFG

     <Certificates>
         <Certificate name="MyFineCertificate" thumbprint="<my_thumbprint>" thumbprintAlgorithm="<my_thumbprint_algo e.g. sha1>" />
     </Certificates>
    

    CSDEF

     <Certificates>
          <Certificate name="MyFineCertificate" storeLocation="LocalMachine" storeName="My" />
     </Certificates> 
    

    Обратите внимание, что я упомянул местоположение магазина как LocalMachine. Теперь вы сможете получить доступ к сертификату из своего кода, указав правильное местоположение.

    var certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...