我在共享应用程序服务计划上有一个Azure函数应用程序,我不想通过Azure Portal导入我的证书。那是因为此应用程序服务计划在组织中共享,这些证书是我想确定的客户证书,我是唯一能够访问它们的人。
因此,我使用功能应用程序设置导入它们(我将它们移至保险柜以获得更多安全性)。
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上载的"预期方式"时,我可以在我的函数应用程序上使用它们,使用worket_load_certificates将其路由到该应用,然后从商店中选择它们(使用X509Store类)。
如果要从PFX文件或包含私钥的CERT设置X509Certificate2
实例,则可以运行到 CryptographiceCeption 中:系统找不到系统。指定的文件..
原因是Windows将私钥存储为用户配置文件目录下的文件。默认情况下,Azure Web App(AppService)不会加载用户配置文件(避免在不需要的情况下大多数情况下开销)。因此,系统找不到指定的文件。问题。要解决,请设置以下应用程序以启用用户配置文件。
weblity_load_user_profile = 1
通过设置应用程序设置WEBSITE_LOAD_USER_PROFILE = 1
,Azure网站将为给定的应用程序加载用户配置文件,因此应用程序可以从PFX文件加载证书。
参考:
https://azure.microsoft.com/en-in/blog/pdf-generation-and-loading-file-certificates-certificates-in-azure-websites/
https://github.com/projectkudu/kudu/wiki/wiki/configurable-settings#the-system-cannot-cannot-find-the-find-the-find-the-file--sissue-with-x509certificate2