У меня есть рабочий процесс, работающий как классическая облачная служба в 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 */
}
}
}
Почему он не появляется? Я даже на правильном пути, или я совершенно не понял, как это работает?