【发布时间】:2020-04-30 00:23:58
【问题描述】:
当我从 Azure 运行我的 webapp 时,我收到一个异常,说它找不到我的证书。
- 我已将 KeyVault 配置为存储我的机密,并将我的私钥证书上传到我的 TLS/SSL 设置。
- 在 Azure Active Directory 中,我注册了我的应用,它与我的私钥证书具有相同的指纹。
- 在我的网络应用配置中,我添加了“WEBSITE_LOAD_CERTIFICATES”=“*”和“KeyVault:Vault”="meiwebapivault"
- 然后在代码中,我的 Program.cs 处理查找证书。 然而,这就是失败的地方。
知道我遗漏了哪些步骤或为什么会失败吗?
我关注了这个tutorial。
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);
}
}
【问题讨论】:
-
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);?为什么要从该用户的个人商店中阅读?那里应该什么都没有。 -
我在本地调试和运行时确实看到了我的证书。我发现问题是证书无效。我将最后一个参数更改为
false,它可以工作。但仍然在 Azure 中,我收到一条错误消息,说它找不到我的连接字符串,该字符串作为密钥存储在 KeyVault 中 -
“在本地调试和运行”与部署到 Azure 应用服务完全不同,因此您的代码不能假定 Azure 上存在个人存储,也不能包含相同类型的证书。您也不应该期望任何人观看 30 分钟的视频然后回答您的问题。
-
它已部署,但这就是它不起作用的地方。我在本地运行它以进行故障排除。我在 Azure 中上传了证书,并认为它存储在该商店中。该视频仅供参考,以了解我的方法。我没想到任何人都必须观看整个事情......
-
@LexLi 为什么投反对票?我只是在寻求帮助...您希望我如何提出这个问题?
标签: .net-core azure-active-directory ssl-certificate azure-web-app-service azure-keyvault