使用pfx文件时,Aure Function应用程序返回“无法识别提供给软件包的凭据”

时间:2019-03-04 13:09:22

标签: azure ssl .net-core azure-functions

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

因此,我使用“功能”应用程序设置导入了这些文件(并且为了确保更高的安全性,我将它们移至保险柜)。

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”上执行此“预期方式”时,可以在我的Function App上使用它们,然后使用WEBSITE_LOAD_CERTIFICATES将其路由到该应用程序,然后从商店中以代码方式选择它们(使用X509Store类)。

1 个答案:

答案 0 :(得分:3)

如果您是从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