【问题标题】:Cannot find Certificate - Azure .NET Core App找不到证书 - Azure .NET Core 应用
【发布时间】:2020-04-30 00:23:58
【问题描述】:

当我从 Azure 运行我的 webapp 时,我收到一个异常,说它找不到我的证书。

  1. 我已将 KeyVault 配置为存储我的机密,并将我的私钥证书上传到我的 TLS/SSL 设置。
  2. 在 Azure Active Directory 中,我注册了我的应用,它与我的私钥证书具有相同的指纹。
  3. 在我的网络应用配置中,我添加了“WEBSITE_LOAD_CERTIFICATES”=“*”和“KeyVault:Vault”="meiwebapivault"
  4. 然后在代码中,我的 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


【解决方案1】:

我的设置是正确的。我只需要从

更改这一行
var certificateCollection = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, true);

var certificateCollection = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false);

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 2021-06-27
    • 2020-03-11
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    相关资源
    最近更新 更多