.NET Core 在 Linux 上将客户端证书添加到 POST 到 Kestrel REST API 失败服务器证书验证
.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 证书的证书。
我已将客户端身份验证证书的颁发子 CA 和 CA 证书复制到 /usr/local/share/ca-certificates/("store")并发出 "update-ca-certificates" 命令。我相信正是这些证书用于验证客户端证书。
当服务器收到请求时,错误值为:
"RemoteCertificateChainErrors" 并拒绝请求。
有人有什么想法吗?
事实证明这确实有效!我只需要获得正确的证书!
具体来说,我必须在服务器端包含根 CA 和中间 CA。
在客户端,我必须只包含根 CA 来验证。
对于 Apache 服务器,Linux ubuntu OS 我们也遇到了同样的问题。
我们通过附加 SSL 证书解决了这个问题。使用 Apache 配置。
我在 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 证书的证书。
我已将客户端身份验证证书的颁发子 CA 和 CA 证书复制到 /usr/local/share/ca-certificates/("store")并发出 "update-ca-certificates" 命令。我相信正是这些证书用于验证客户端证书。
当服务器收到请求时,错误值为: "RemoteCertificateChainErrors" 并拒绝请求。
有人有什么想法吗?
事实证明这确实有效!我只需要获得正确的证书!
具体来说,我必须在服务器端包含根 CA 和中间 CA。
在客户端,我必须只包含根 CA 来验证。
对于 Apache 服务器,Linux ubuntu OS 我们也遇到了同样的问题。 我们通过附加 SSL 证书解决了这个问题。使用 Apache 配置。