我有一个带有Kestrel的ASP.NETCore 6应用程序,它需要客户端应用程序和服务器之间的mTLS。我使用powershell中的为客户端创建了自签名根证书和子证书。下面是将根证书显式加载到Kestrel的方式:
var rootCertFile ="xxx.pfx";
var rootCertPw = "abc";
X509Certificate2 rootCert = new X509Certificate2( rootCertFile, rootCertPw);
webBuilder.ConfigureKestrel(o =>
{
o.ConfigureHttpsDefaults(o =>
{
o.ServerCertificate = rootCert;
o.ClientCertificateMode = ClientCertificateMode.RequireCertificate;
});
});
webBuilder.UseKestrel(o =>
{
o.Listen(IPAddress.Parse(myHttpsEndPointIpAddr), myHttpsEndPointPort,
listenOptions =>
{
listenOptions.UseHttps();
});
o.Listen(IPAddress.Parse(myHttpEndPointIpAddr), myHttpEndPointPort);
});如果某个客户端(例如curl或postman)调用(使用根签名的子证书)某些https端点,则如果根证书不存在于本地计算机的受信任根证书颁发机构证书库中,则客户端将收到错误并拒绝调用。以下是客户端看到的错误:
* TLSv1.2 (IN), TLS header, Unknown (21):
* TLSv1.2 (IN), TLS alert, unknown CA (560):
* OpenSSL SSL_read: error:0A000418:SSL routines::tlsv1 alert unknown ca, errno 0
* Failed receiving HTTP2 data
* OpenSSL SSL_write: SSL_ERROR_ZERO_RETURN, errno 0
* Failed sending HTTP2 data一旦根证书被添加到本地计算机的受信任根证书颁发机构证书存储区,rest调用就会成功。如果Kestrel直接加载根证书,为什么需要将根自签名证书安装到受信任的根证书颁发机构证书存储区?
发布于 2022-12-02 06:00:39
从这中我们可以看到Recognizing client certificates有两种方式。
首先,服务器没有将自签名客户端证书识别为有效证书.这可以通过以下方法解决: 1.将所有客户端证书(或将它们全部签名的根CA )添加到操作系统的受信任证书存储区;或者2.向kestrel添加ClientCertificateValidation回调以确定证书是否被接受或拒绝。
根证书需要在您的主机系统上被信任。默认情况下,没有由证书颁发机构创建的根证书将不受信任。有关如何信任Windows上的根证书的信息,请参阅此问题。
这是一个例子:在Kestrel .NET核中加载中间CA签名的SSL证书的正确方法
阅读安装受信任的根证书和受信任的根证书颁发机构证书存储以了解更多信息。
https://stackoverflow.com/questions/74640857
复制相似问题