C# .NET Core添加客户端证书以发布到Linux上的Kestrel REST API时,服务器证书验证失败
我在Linux上使用.NETCore2.1,Kestrel 作为客户机的web应用程序也会发出请求(以下是点播的指南,这似乎是一种方法): 我已将红隼配置为: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
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;
}