azure - 使用 pfx 文件时,Azure Function App 返回 'The credentials supplied to the package were not recognized'

标签 azure ssl .net-core azure-functions

我在共享应用服务计划中有一个 Azure Function 应用,但我不想通过 Azure 门户导入我的证书。这是因为此应用服务计划是在组织内共享的,并且这些证书是客户端证书,我想确保我是唯一能够访问它们的人。

因此,我使用 Function 应用设置导入它们(并且我将它们移至 Vault 以提高安全性)。

byte[] bytearray; // PFX file, imported from settings using base64 encoding
string password; // Imported from settings
certificates = new X509Certificate2Collection();
certificates.Import(bytearray, password, X509KeyStorageFlags.UserKeySet | X509KeyStorageFlags.PersistKeySet);

使用它们就像这样

var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
foreach (var cert in certificates)
handler.ClientCertificates.Add(cert);

但是连接被拒绝,并出现错误“无法识别提供给包的凭据”。

我尝试了一些事情

  • 我确信 PFX 已正确插入,因为我可以读取其中的 3 个证书。
  • 只有其中一个证书具有带客户端身份验证的 EKU,其他证书都存在,因为这是私有(private)生成的证书并且它们代表了链。
  • 我尝试先将 PFX 保存到本地文件存储。我认为这可能是一个选项,因为我知道所有证书都会首先通过本地证书存储,因为屏蔽私钥的安全隐患,并且该存储保持对 PFX 文件的句柄打开(磁盘上可能存在也可能不存在) 。但这没有用。
  • 我知道证书没问题,因为在执行“预期方式”时,我可以在我的函数应用程序上使用它们,在 Azure 上上传,使用 WEBSITE_LOAD_CERTIFICATES 将它们路由到应用程序,然后在代码中从商店中选择它们(使用 X509Store 类)。

最佳答案

如果您从包含私钥的 pfx 文件或证书编码设置 X509Certificate2 实例,您可能会遇到 CryptographicException:系统找不到该文件指定..

原因是 Windows 将私钥作为文件存储在用户配置文件目录下。默认情况下,Azure Web App (AppService) 不加载用户配置文件(避免大多数不需要的场景的开销)。因此,系统找不到指定的文件。问题。要解决此问题,请设置以下 appSetting 以启用用户配置文件。

WEBSITE_LOAD_USER_PROFILE=1

通过设置应用程序设置WEBSITE_LOAD_USER_PROFILE = 1,Azure 网站将加载给定应用程序的用户配置文件,因此应用程序可以从 PFX 文件加载证书。

引用文献:

https://azure.microsoft.com/en-in/blog/pdf-generation-and-loading-file-based-certificates-in-azure-websites/

https://github.com/projectkudu/kudu/wiki/Configurable-settings#the-system-cannot-find-the-file-specified-issue-with-x509certificate2

关于azure - 使用 pfx 文件时,Azure Function App 返回 'The credentials supplied to the package were not recognized',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54983993/

相关文章:

azure - 使用 DotNet SDK 创建逻辑应用程序和 API 连接 ARM 模板

c# - 必须启用 SSL 才能连接到 https 站点?

c# - 在 ASP.NET Core 上检测与 SSE 的断开连接

.net-core - .NET Core/Standard .csproj 文件,嵌入许可证文件而不将其添加到使用包的项目中?

azure - Microsoft Azure 文本识别边界框响应中的 (X,Y) 坐标是什么单位?

azure - azure force 会自行终止进程吗?我的 nodeJS/Java 进程/Jmeter 被强制终止

ruby-on-rails - 在 Ruby 中通过 SSL 调用 API

.net - 协商 SSL 连接时出现 IBM MQ 2538 错误

c# - AWS Lambda 环境变量和依赖注入(inject)

azure - 您能否看到在 Azure 应用程序网关 WAF 上触发的防火墙规则