使用 ASP.NET Core 处理相互 TLS 验证

问题描述 投票:0回答:1

这就是我的服务器应用程序

Program.cs
的外观:

var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(kestelOptions =>
{
    kestelOptions.ConfigureHttpsDefaults(httpOptions =>
    {
        httpOptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;
    });
});

var services = builder.Services;

services.AddAuthentication(CertificateAuthenticationDefaults.AuthenticationScheme)
    .AddCertificate(options =>
    {
        options.AllowedCertificateTypes = CertificateTypes.All;
        options.RevocationMode = X509RevocationMode.Online;
    });

services.AddInfrastructureServices(builder.Configuration);
services.AddControllersWithViews();

var app = builder.Build();
app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();

我必须使用 mTLS 对多个客户端进行身份验证,并将其经过验证的证书指纹和序列号存储在数据库中。但如何验证包含证书的请求是否有效呢?我的意思是每个人都可以获得网站证书,因此将数据库中的指纹和序列与发送的证书进行比较是不够的。

但是如何验证呢?我不知道。

asp.net-core authentication mtls
1个回答
0
投票

这是一个老问题,但我会给出我的观点以供将来参考。

首先,让我们了解一些基本的证书知识,以便我们就我们正在讨论的内容达成一致。

服务器证书

Web 服务器证书(对于普通 TLS,无论 m 是否为相互)是在 Web 服务器端使用的证书,用于向客户端(主要是浏览器)验证服务器所有者也拥有该域(这是使用已建立的验证证书签名和验证技术),验证证书是否有效是在 TLS 握手期间完成的,浏览器会检查计算机的信任存储中用于签署 Web 服务器证书的证书以查看其是否有效。如果有效,握手继续。

mTLS

使用 mTLS(双向 TLS),客户端还拥有一个向服务器提供的证书,以便服务器根据信任列表进行验证。信任列表通常是 Web 服务器用于验证的串联根证书和中间证书的文件,或者是服务器操作系统的信任存储区。如果已签署客户端证书的中间证书在信任存储中,则它是有效的。

CRL

这两种技术还使用证书吊销列表,在证书本身及其父链(中间、根)的信息中引用这些列表,以查看证书在注册后是否被吊销。如果被撤销,握手将失败并且连接终止。

这些握手对话将允许任何拥有服务器信任的 CA(证书颁发机构)签名证书的客户端(推断握手成功完成上述步骤)。因此,在完全公共领域使用它,必须有某种方法来确定哪些客户端要注册登录以及拒绝哪些客户端。

公共领域(互联网)

如果您打算在完全公共的环境(互联网)中与any用户一起使用这种解决方案(mTLS),那么我认为证书不是验证或授权用户的正确方法,除非有其他方法将他们注册为用户或通过其他方式在身份验证后授权他们的行为。

自定义有限域(组织内部或选定的几个组织之间)

如果在更有限的领域中使用,例如在公司内部或在同一领域运营的组织之间,则完全在公司内部使用自定义 CA 或仅按照标准化证书签名的 CA 组织的情况并不少见。同一领域的有限数量的公司之间的程序。然后,CA 会将这一流程的合法性责任推给公司。

在这种情况或域中使用 mTLS 的麻烦要少得多,也许,您可以只信任服务器端该自定义 CA 的中间或根证书,然后允许来自具有您信任的自定义 CA 证书的客户端的连接。

公钥基础设施(维基百科)

身份验证与授权

也就是说,身份验证(让用户“通过大门”)与授权(用户进入后可以执行的操作)之间存在差异。 授权与身份验证(Okta)我认为这是您问题的核心。您可以通过让任何拥有客户端证书的人登录来完成身份验证,并在他们第二次登录时通过验证指纹将他们验证为不同的用户。

证书过期

保存指纹的问题是证书有一个到期日期,通常,在注册新证书时,指纹和序列号也会重新呈现,因此将其保存在数据库中并不是真正可行的跟踪方法随着时间的推移,用户。在自定义 CA 和有关如何处理证书的策略内,证书的主题字段可以包含用户标识符,该标识符与 CA 的证书链一起保证由具有不同主题字段的不同颁发机构签名的证书将无论证书续订和指纹+串行重新渲染如何,都是相同的用户实体。

© www.soinside.com 2019 - 2024. All rights reserved.