Azure Web App:System.Security.Cryptography.CryptographicException:键集不存在

时间:2018-04-06 13:30:36

标签: azure azure-web-app-service x509certificate2

我的应用遇到" 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应用程序后台发生的事情?

2 个答案:

答案 0 :(得分:0)

尝试从Web应用程序中删除WEBSITE_LOAD_USER_PROFILE应用程序设置(如果可用)。

答案 1 :(得分:0)

在Azure WebApp中,为我解决的问题是,在调用Keyset does not exist时,“有时”会引发GetPrivateKey()的问题是不使用MachineKeySet作为{{的构造函数中的存储标志参数1}}

X509Certificate2