Когда я запускаю свое веб-приложение из Azure, я получаю исключение о том, что он не может найти мой сертификат.
- Я настроил KeyVault для хранения своих секретов и загрузил свой сертификат закрытого ключа в настройки TLS / SSL.
- В Azure Active Directory Я зарегистрировал свой приложение, которое имеет тот же отпечаток, что и мой сертификат закрытого ключа.
- В конфигурации моего веб-приложения я добавил "WEBSITE_LOAD_CERTIFICATES" = "*" и "KeyVault: Vault" = "meiwebapivault"
- Затем в коде мой Program.cs обрабатывает поиск сертификата. Однако это - то, где это терпит неудачу.
Любая идея, какие шаги я пропускаю или почему это терпит неудачу?
Я следовал этому учебнику .
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(builder =>
{
var root = builder.Build();
var vaultName = root["KeyVault:Vault"];
if (!string.IsNullOrEmpty(vaultName))
{
builder.AddAzureKeyVault($"https://{vaultName}.vault.azure.net/",
root["KeyVault:ClientId"],
GetCertificate(root["KeyVault:Thumbprint"]),
new PrefixKeyVaultSecretManager("WebApi"));
}
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
private static X509Certificate2 GetCertificate(string thumbprint)
{
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
try
{
store.Open(OpenFlags.ReadOnly);
var certificateCollection = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, true);
if (certificateCollection.Count == 0)
throw new Exception("Certificate is not installed"); //<------------- FAILS HERE
return certificateCollection[0];
}
finally
{
store.Close();
}
}
}
{
"KeyVault": {
"Vault": "",
"ClientId": "6ac#####-####-####-####-######ffe96",
"Thumbprint": "4EC2C##############################4507C"
},
public class PrefixKeyVaultSecretManager : IKeyVaultSecretManager
{
private readonly string _prefix;
public PrefixKeyVaultSecretManager(string prefix)
{
_prefix = $"{prefix}-";
}
public string GetKey(SecretBundle secret)
{
return secret.SecretIdentifier.Name.Substring(_prefix.Length)
.Replace("--", ConfigurationPath.KeyDelimiter);
}
public bool Load(SecretItem secret)
{
return secret.Identifier.Name.StartsWith(_prefix);
}
}