首页 > 解决方案 > 在 C# Azure 函数 (v2) 中使用来自 Azure Key Vault 的不可导出客户端证书

问题描述

我正在尝试将客户端证书身份验证设置为外部 API。不可导出的客户端证书位于 Azure Key Vault 中。我的代码是托管在应用服务计划中的 Azure v2 函数中的 C# (.NET Core)。由于客户端证书不可导出,因此我无法将其放入我的应用服务计划的证书存储中。

我以前使用Azure Key Vault中的可导出客户端证书获得了客户端证书身份验证 PoC。我已将可导出的客户端证书导入到我的应用服务计划的证书存储中,并且从那里我只是以非常标准的方式使用 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 堆栈也生成的数据相匹配的“证明”数据。我也更愿意将此委托给基础设施,因此在应用程序代码中处理它是我不得已的绝对行动。

标签: azure-functionsdotnet-httpclientazure-keyvaultclient-certificates

解决方案


推荐阅读