.NET Core将客户端证书添加到POST请求中,但无法在Kestrel REST API中进行检索

时间:2019-05-28 16:29:15

标签: c# authentication .net-core kestrel

我正在Linux上使用.NET Core 2.1,Kestrel。

我作为客户端的Web应用程序发出了这样的请求(遵循一些指南,这似乎很可行):

var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
X509Certificate2 cert = GetClientCertificate();
handler.ClientCertificates.Add(cert);

using (var client = new HttpClient(handler))
     {
        var myRequest= new myRequest()
          {
                foo = bar,
            };

var response = await client.PostAsync(myUrl, myRequest, new JsonMediaTypeFormatter());

在接收方Web应用程序上,我添加了中间件

public async Task Invoke(HttpContext context)
{
    var certificate = await context.Connection.GetClientCertificateAsync();

但是证书始终为空!

我也尝试过:

context.Connection.ClientCertificate;

我也尝试查看标题,但是标题仅返回以下内容:

foreach (var h in context.Request.Headers)
{
    Log.Debug("key:" + h.Key +  ", value:" + h.Value);
}
  

键:传输编码,值:分块

     

key:Content-Type,值:application / json; charset = utf-8 2019-05-28 16:15:13,771

     

键:主机,值:mytest应用程序:5000

我已经这样配置了Kestrel:

    return WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(options =>
        {
            options.Listen(IPAddress.Any, 443, listenOptions =>
            {

            var httpsConnectionAdapterOptions = new HttpsConnectionAdapterOptions()
                {
                    ClientCertificateMode = ClientCertificateMode.RequireCertificate,
                    SslProtocols = System.Security.Authentication.SslProtocols.Tls12,
                    ServerCertificate = GetServiceCertificate()
                };
                listenOptions.UseHttps(httpsConnectionAdapterOptions);
            });
        }
        )
    .Build();

是因为我未正确配置Kestrel吗?还是因为它是中间件而我在上下文中找错了地方?还是别的?

2 个答案:

答案 0 :(得分:0)

结果证明这实际上是有效的!我只需要获得正确的证书即可!

答案 1 :(得分:0)

对于带有Apache Server的Linux ubuntu OS,我们也面临同样的问题。 我们通过附加SSL证书解决了该问题。使用Apache Config。