我的应用遇到" System.Security.Cryptography.CryptographicException:键集不存在"创建X509Certificate2期间的异常。
从Azure Key Vault读取证书的功能:
private string GetEncryptSecret(string certConfigName)
{
var kv = new KeyVaultClient(GetToken);
var sec = kv.GetSecretAsync(WebConfigurationManager.AppSettings[certConfigName]).Result;
return sec.Value;
}
我如何创建新的X509Certificate2对象:
public X509Certificate2 GetCertificate(CertificatesEnum certificate)
{
switch (certificate)
{
case CertificatesEnum.Accounts:
return new X509Certificate2(
Convert.FromBase64String(GetEncryptSecret(Constants.Magda.Certificates.Accounts)),
string.Empty, X509KeyStorageFlags.MachineKeySet);
}
}
在注意到这仅适用于前3-9个请求时,我启动了Azure远程调试会话,并看到新的certificate.Privatekey导致了" System.Security.Cryptography.CryptographicException:键集不存在"异常。
通过执行等待循环临时修复此问题,因为在几次重试之后,将毫无例外地创建新证书。
public X509Certificate2 GetCertificate(CertificatesEnum certificate)
{
switch (certificate)
{
case CertificatesEnum.Accounts:
var accountCertRawData = Convert.FromBase64String(GetEncryptSecret(Constants.Magda.Certificates.Accounts));
X509Certificate2 accountCert = null;
for (int i = 0; i < 20; i++)
{
try
{
accountCert= new X509Certificate2(accountCertRawData , string.Empty,
X509KeyStorageFlags.MachineKeySet);
//set variable to test exception
var accountCert = accountCert.PrivateKey;
break;
}
catch (System.Security.Cryptography.CryptographicException)
{
Thread.Sleep(1000 * i);
}
}
return accountCert;
}
}
有没有人有适当的解决方案,可以解释Azure Web应用程序后台发生的事情?
答案 0 :(得分:0)
尝试从Web应用程序中删除WEBSITE_LOAD_USER_PROFILE应用程序设置(如果可用)。
答案 1 :(得分:0)
在Azure WebApp中,为我解决的问题是,在调用Keyset does not exist
时,“有时”会引发GetPrivateKey()
的问题是不使用MachineKeySet
作为{{的构造函数中的存储标志参数1}}
X509Certificate2