我使用 Yarp 作为 ASP.NET 应用程序的负载均衡器。 ASP.NET 应用程序需要客户端证书。
我遇到一个问题,无法将 ClientCertificate 设置为 handler.SSLOptions.ClientCertificate 的一部分,除非我在 Yarp 初始化中对证书进行硬编码。我不想对证书路径进行硬编码,而是获取随请求发送到 Yarp 的证书,然后使用该证书动态设置 handler.SSLOptions.ClientCertificate,以便将其发送到目的地。如果我使用 AddTransforms、AddClientCertHeader,它确实可以正确中继证书,但它会将其放在请求标头中,而不是 handler.SSLOptions.ClientCertificate 中。
非常感谢您提供的任何帮助,希望您编码愉快!
当我尝试此代码块时,证书设置完美。但是,我只能使用一个硬编码的证书。
`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");
});
YARP 无法使用传入的客户端证书作为客户端证书,因为它缺少私钥。
设置 handler.SslOptions.ClientCertificate 让 YARP 服务器向后端进行身份验证...它不代表用户,而是代表 YARP 服务器/服务本身。
ClientCertHeader 是 YARP(或任何代理)转发其看到的 TLS 客户端证书信息的唯一方式。如果它可以重新断言证书,那么任何具有中间人 (MitM) 的人也可以这样做,这将从根本上破坏相互身份验证。
如果应用程序要求使用 TLS 客户端身份验证,那么您必须“直接”连接到应用程序(这仍然可能涉及 NAT/LB/路由,但不涉及“代理”)。