Azure Web应用程序偶尔会抛出CryptographicException异常:密钥集不存在。

6
我有一个托管在Azure上的身份验证服务器Web应用程序。它的根目录中有一个.pfx文件用于签名。问题在于,当新发布时,它可以正常工作,但是一段时间后,它开始抛出“CryptographicException: Keyset does not exist.”的错误。
根据“CryptographicException KeySet does not exists”的StackOverflow解释,我认为这可能是文件访问问题,但为什么Azure会突然搞乱文件访问呢?

我有类似的问题。我猜测可能与数据保护密钥有关,但还不确定。 - NDeveloper
2个回答

3
我最近偶尔看到了相同的异常。在我的情况下,这是由于在不同部署槽之间切换时数据保护密钥发生更改引起的。当使用默认配置和将应用程序托管在Azure App Service上时,使用services.AddDataProtection()会将数据保护密钥存储在%HOME%\ASP.NET\DataProtection-keys中。该目录由网络共享支持,以确保密钥在所有应用程序实例上都可用,但是对于部署槽则不是这种情况。因此,当你从一个部署槽切换到另一个部署槽时,密钥将更改,当您的应用程序尝试取消保护有效负载时,您将看到CryptographicException: Keyset does not exist为确保您的应用程序始终使用相同的密钥,请配置不同的密钥存储提供程序。例如,使用Redis或Azure Blob Storage作为后备存储。
有关如何进行配置的更多信息,请参阅官方文档
我也在我的博客上描述了我遇到的问题。

0

我建议您不要首先从磁盘检索签名证书。相反,在Azure门户中将证书上传到相关的Web应用程序中。

然后在应用程序启动时检索证书

类似于以下内容。

X509Certificate2 Certificate = null;
var certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certStore.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
var certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint,"CERTIFICATE_THUMBPRINT_HERE",false);
Certificate = certCollection[0];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接