Azure web应用程序偶尔抛出CryptographicException: Keyset不存在
本文关键字:CryptographicException Keyset 不存在 web 应用程序 偶尔 Azure | 更新日期: 2023-09-27 18:07:05
我有一个托管在Azure上的Identity Server
web应用程序。它的根目录中有一个.pfx
文件用于签名。问题是,当新发布它的工作非常好,但一段时间后,它开始抛出CryptographicException: Keyset does not exist.
基于CryptographicException KeySet不存在,我认为这是一个文件访问问题,但为什么突然蔚蓝搞砸了文件访问。
我偶尔会看到同样的异常。在我的情况下,这是由于在部署槽之间交换时数据保护密钥发生变化造成的。当使用services.AddDataProtection()
与默认配置和托管应用程序在Azure应用程序服务,数据保护密钥存储在%HOME%'ASP.NET'DataProtection-keys
。该目录由网络共享支持,以确保密钥在所有应用程序实例上可用,但是对于部署槽不是这样的。因此,当你从一个部署槽切换到另一个部署槽时,密钥将发生变化,当你的应用程序试图取消有效负载保护时,你将看到CryptographicException: Keyset does not exist
。
为了确保你的应用总是使用相同的密钥,你需要配置一个不同的密钥存储提供者。例如,使用Redis或Azure Blob Storage作为后备存储。
你可以在官方文档中找到关于如何配置这个的更多信息。
我也在我的博客上描述了这个问题。
我建议您不要首先从磁盘检索签名证书。而是将证书上传到Azure Portal中的相关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];