KeyVault的Kestrel安全HTTPS X509证书

时间:2018-10-29 23:15:03

标签: ssl asp.net-core x509certificate2 azure-keyvault kestrel

我想用我存储在KeyVault中的pfx证书保护我的API,但是由于某种原因,这似乎无法按我预期的方式工作。如果我的计算机上安装了证书,则可以正常运行。我想知道是否有可能将证书存储在KeyVault中,然后以这种方式保护它,而不是在证书存储区中查找它。

方案是我有一个与KeyVault对话的.NET Core Web API。此KeyVault包含我的PFX证书,当我上传时会提示您输入密码。因此,此时一切似乎都很好。

我有以下代码来检索和应用证书:

            var client = new KeyVaultClient(new KeyVaultCredential(GetToken));
            var cert = client.GetCertificateAsync("https://somekeyvaultsomewhere.vault.azure.net/", "my_tls_cert").Result;
            var certificate = new X509Certificate2(cert.Cer);

            var host = new WebHostBuilder()
                .UseKestrel(options =>
                {
                    const int PortNumber = 5001;
                    options.Listen(
                        new IPEndPoint(IPAddress.Any, PortNumber),
                        listenOptions =>
                        {
                            listenOptions.KestrelServerOptions.AddServerHeader = false;
                            listenOptions.UseHttps(certificate);
                        });
                })
                .CaptureStartupErrors(true)
                .UseStartup<Startup>()
                .Build();

            host.Run();

我希望能够通过https和端口5001来访问我的API。相反,我没有任何回应(无法访问站点)。

似乎一切都在运行,但是什么也打不了。

enter image description here

这可能吗?

消耗的包裹:

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.6" />
    <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.1.3" />
    <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Https" Version="2.1.3" />
    <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions" Version="2.1.3" />
  </ItemGroup>

1 个答案:

答案 0 :(得分:4)

我认为这是因为您下载的证书不是完整的证书,而只是公共密钥。缺少私钥将阻止SSL握手完成。您可以将整个证书作为密码下载,然后将密码转换为X509Certificate2对象。我已经在这篇博客文章中进行了解释:

https://azidentity.azurewebsites.net/post/2018/07/03/azure-key-vault-certificates-are-secrets