繁体   English   中英

将Linux客户端证书添加到Linux上的Kestrel REST API的.NET Core无法通过服务器证书验证

[英].NET Core adding client certificate to POST to Kestrel REST API on Linux fails server cert validation

我在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());

我已经将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 = GetSSLCertificate(),
                    ClientCertificateValidation = CertificateValidator.MyCustomerValidatorForLogging
                };
                listenOptions.UseHttps(httpsConnectionAdapterOptions);
            });
        }
        )
    .Build();

我添加了一个自定义验证器(只是为了看看发生了什么,看起来像这样):

public static bool MyCustomerValidatorForLogging(X509Certificate2 certificate, X509Chain chain, SslPolicyErrors errors)
        {
            Log.Info("Received Request");
            Log.Error(errors.ToString());

            if (errors == SslPolicyErrors.None)
            {
                return true;
            }

            return false;
        }

GetClientCertificate()是由中间CA签名的客户端身份验证SSL证书的证书。

GetSSLCertificate()是标准服务器身份验证SSL证书的证书。

我已将客户端身份验证证书的Sub CA和CA证书复制到/ usr / local / share / ca-certificates /(“store”)并发出“update-ca-certificates”命令。 我相信这些证书用于验证客户端证书。

当服务器收到请求时,错误值为:“RemoteCertificateChainErrors”并拒绝该请求。

有人有什么想法吗?

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

具体来说,我必须在服务器端包含根CA和中间CA.
客户端,我必须只包括根CA来验证。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM