C# .NET Core添加客户端证书以发布到Linux上的Kestrel REST API时,服务器证书验证失败

C# .NET Core添加客户端证书以发布到Linux上的Kestrel REST API时,服务器证书验证失败,c#,authentication,.net-core,certificate,kestrel,C#,Authentication,.net Core,Certificate,Kestrel,我在Linux上使用.NETCore2.1,Kestrel 作为客户机的web应用程序也会发出请求(以下是点播的指南,这似乎是一种方法): 我已将红隼配置为: return WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseKestrel(options => { options.Listen(IPAddress.Any, 4

我在Linux上使用.NETCore2.1,Kestrel

作为客户机的web应用程序也会发出请求(以下是点播的指南,这似乎是一种方法):

我已将红隼配置为:

    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();
GetClientCertificate()是由中间CA签名的客户端身份验证SSL证书的证书

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

我已将客户端身份验证证书的颁发子CA和CA证书复制到/usr/local/share/CA certificates/(存储)中,并发出了“更新CA证书”命令。我相信这些证书是用来验证客户证书的

服务器收到请求时,错误值为: “RemoteCertificateChaineErrors”并拒绝请求


有人有什么想法吗?

事实证明这确实有效!我只需要拿到正确的证书

具体来说,我必须在服务器端包括根CA和中间CA。

在客户端,我必须只包括根CA进行验证。

对于使用Apache服务器的Linux ubuntu操作系统,我们也面临同样的问题。
我们通过使用Apache配置附加SSL证书来解决此问题。

这意味着在验证SSL证书时出现错误RemoveCertificateChaineErrors是一个包含错误的数组。当RemoteCertificateChainErrors发生时,您可以检索ChainStatus并获取详细信息。我没有使用Apache:(你是什么意思,你必须在客户端包含根CA?你也必须将根CA证书附加到客户端请求吗?我想我遇到了类似的情况…因为我的客户端运行Linux,我必须添加到信任中,根CA-它将发送一个带有根公钥的请求,而不仅仅是叶。如果你是正在运行MS Windows,并且请求来自此服务器,那么您必须确保CA具有根证书。
    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;
        }