我正在尝试设置对外部 API 的客户端证书身份验证。这不可出口的客户端证书位于 Azure Key Vault 中。我的代码是应用服务计划中托管的 Azure v2 函数中的 C# (.NET Core)。由于客户端证书不可导出,因此我无法将其放入我的应用服务计划的证书存储中。
我之前有一个客户端证书身份验证 PoC 与可出口的来自 Azure Key Vault 的客户端证书。我已将可导出的客户端证书导入到我的应用程序服务计划的证书存储中,从那里我只是以非常标准的方式使用 HttpClient 和 HttpClientHandler:
builder.Services.AddHttpClient("certificateClient")
.ConfigurePrimaryHttpMessageHandler(
() => {
var handler = new HttpClientHandler();
handler.SslProtocols = SslProtocols.None;
handler.ClientCertificates.Add(certificate);
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
return handler;
});
builder.Services.AddScoped<HttpClient>(i => i.GetRequiredService<IHttpClientFactory>().CreateClient("certificateClient"));
该证书是从应用服务计划的密钥存储中检索的。这有效。我只是将客户端证书附加到 HttpClientHandler,所有客户端证书身份验证握手均由底层 Azure Functions/ASP.NET Core 基础结构自动处理。
现在我有一个不可出口的客户端证书不在我的应用程序服务计划的密钥存储中,我无法将其附加到我的 HttpClient 的 HttpClientHandler,因此上述方法不起作用。
据我了解,TLS 客户端身份验证握手中所需的“证明”数据的私钥签名需要委托给 Azure Key Vault 的加密设施。我试图找出如何通过调用 HttpClient 或 HttpClientHandler 之类的方法,让此委托私钥签名在其所属的基础设施级别上工作。
我在 HttpClient(Handler) 或 ASP.NET Core 的 API 文档中找不到任何可以在基础结构级别执行此操作的方法/属性。它们可能存在,只是我找不到它们。
我没有示例代码,因为我无法弄清楚要使用哪些 API,或者这在我的 C# v2 函数技术堆栈中是否可行。
是否有其他 ASP.NET Core 类可以处理此类问题?我是否试图以错误的方式解决这个问题?即我是否需要停止尝试继续使用 HttpClient(Handler) 并尝试一种完全不同的方式来执行此操作?
注意:我认为在用尽所有其他选项之前尝试在应用程序代码中重新实现 TLS 客户端身份验证握手是不明智的。虽然在标头中附加公共客户端证书很容易,但我认为自己生成私钥签名所需的“证明”数据将非常困难。我认为我无法轻松访问正确的数据来生成与服务器端 TLS 堆栈生成的数据相匹配的“证明”数据。我也更愿意将其委托给基础设施,因此在应用程序代码中处理它是我最后采取的绝对行动。