Yarp 可以使用 builderContext.AddCertHeader 中的值动态设置 handler.SSLOptions.ClientCertificate 证书值吗?

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

我使用 Yarp 作为 ASP.NET 应用程序的负载均衡器。 ASP.NET 应用程序需要客户端证书。

我遇到一个问题,无法将 ClientCertificate 设置为 handler.SSLOptions.ClientCertificate 的一部分,除非我在 Yarp 初始化中对证书进行硬编码。我不想对证书路径进行硬编码,而是获取随请求发送到 Yarp 的证书,然后使用该证书动态设置 handler.SSLOptions.ClientCertificate,以便将其发送到目的地。如果我使用 AddTransforms、AddClientCertHeader,它确实可以正确中继证书,但它会将其放在请求标头中,而不是 handler.SSLOptions.ClientCertificate 中。

非常感谢您提供的任何帮助,希望您编码愉快!

Screenshot of HttpClient Setup

Screenshot of Transform Setup

当我尝试此代码块时,证书设置完美。但是,我只能使用一个硬编码的证书。

`builder.Services.AddReverseProxy() .ConfigureHttpClient((上下文, 处理程序) => { handler.SslOptions.ClientCertificates = new X509Certificate2Collection(clientCert); }) .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));``

当我尝试此代码块时,调用证书已正确中继,但它只允许我将其放入标头中。

builder.Services.AddReverseProxy()
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"))
.AddTransforms(builderContext =>
{
builderContext.AddClientCertHeader(headerName: "ssl.ClientCertificate");
});
dynamic certificate httpclient yarp
1个回答
0
投票

YARP 无法使用传入的客户端证书作为客户端证书,因为它缺少私钥。

设置 handler.SslOptions.ClientCertificate 让 YARP 服务器向后端进行身份验证...它不代表用户,而是代表 YARP 服务器/服务本身。

ClientCertHeader 是 YARP(或任何代理)转发其看到的 TLS 客户端证书信息的唯一方式。如果它可以重新断言证书,那么任何具有中间人 (MitM) 的人也可以这样做,这将从根本上破坏相互身份验证。

如果应用程序要求使用 TLS 客户端身份验证,那么您必须“直接”连接到应用程序(这仍然可能涉及 NAT/LB/路由,但不涉及“代理”)。

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