使用pfx文件时,Azure Function App会返回“无法识别提供给包的凭据”

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

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

所以我使用功能应用程序设置导入它们(我将它们移动到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,其他证书都在那里,因为这是一个私有生成的证书,它们代表链。
  • 我尝试首先将PFX保存到本地文件存储。我认为这可能是一个选项,因为我了解所有证书首先通过本地证书存储,因为屏蔽私钥的安全隐患,并且此存储保持对PFX文件(磁盘上可能存在或不存在)的句柄。那没用。
  • 我知道证书是可以的,因为我可以在我的功能应用程序上使用它们,当在Azure上传这个“预期的方式”时,使用WEBSITE_LOAD_CERTIFICATES将它们路由到应用程序,然后在代码中从商店中选择它们(使用X509Store)类)。
azure ssl .net-core azure-functions
1个回答
3
投票

如果从pfx文件或包含私钥的cert编码设置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

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