如何解决System.Security.Cryptography.CryptographicException:指定的提供程序类型无效

时间:2017-07-12 09:19:59

标签: c# google-sheets cryptography x509certificate2 system.security

我开发了从我的应用程序访问谷歌电子表格。它工作好几天但现在我有一个例外

  

" System.Security.Cryptography.CryptographicException:无效的提供者   指定的类型。"

我无法弄清楚问题是什么? 我的代码在我的本地机器上工作正常,但在服务器中#34;得到异常"。

这是堆栈跟踪:

at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)
at System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()
at Google.Apis.Auth.OAuth2.ServiceAccountCredential.Initializer.FromCertificate(X509Certificate2 certificate)

我已经搜索过,但我找不到确切的解决方案。我认为我的代码没有问题。

这是我的代码:

            string applicationName = "#########";  

            var serviceaccountemail = "********************************";

            var certificate = new X509Certificate2(GetCertificateBytes(), "notasecret", X509KeyStorageFlags.Exportable);

            ServiceAccountCredential credential = new ServiceAccountCredential(
              new ServiceAccountCredential.Initializer(serviceaccountemail)
              {
                  Scopes = new[] { "https://spreadsheets.google.com/feeds" }
              }.FromCertificate(certificate));

            var service = new SheetsService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = applicationName,
            });

            String spreadsheetId = "*************************";

            String range = "Sheet1!A1:C";

            SpreadsheetsResource.ValuesResource.GetRequest request = 
                service.Spreadsheets.Values.Get(spreadsheetId, range);

            ValueRange response = request.Execute();



 public byte[] GetCertificateBytes()
        {
            return secure.SecureResource.qa_automation_google_key;
        }

这是一个更新:
当我调试上面的代码时,我看到了'((System.Security.Cryptography.RSACryptoServiceProvider)certificate.PrivateKey).CspKeyContainerInfo.CryptoKeySecurity' threw an exception of type 'System.Security.AccessControl.PrivilegeNotHeldException'的异常 在 X509certificate2证书。 所以,我认为因为这个例外我指定了无效的提供者类型。

以下是有关我的证书的信息:
1.文件.p12
2.提供类型是1
3.使用算法是 sha1rsa 4.我的证书版本是 v1

如果您需要任何其他信息,请提供评论。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用以下代码实例化X509证书。

x509Certificate =新的X509Certificate2(rawData,密码,X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

研究了将近2天后,它对我有用。