Как решить System.Security.Cryptography.CryptographicException: указан неверный тип поставщика
Я разработал доступ к электронной таблице Google из моего приложения. Она работает отлично в течение нескольких дней, но теперь я получил исключение, так как
"System.Security.Cryptography.CryptographicException: указан неверный тип поставщика."
Я не могу понять, в чем проблема? Мой код работает нормально на моей локальной машине, но на сервере "получить исключение".
Вот трассировка стека:
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'
на сертификат X509 сертификат2. Итак, я подумал, что из-за этого исключения у меня указан неверный тип провайдера.
Вот информация о моем сертификате:
1. Файл.p12
2. Тип провайдера 1
3. используя алгоритм ша1рса.
4. версия моего сертификата v1.
Если вы хотите любую другую информацию, пожалуйста, прокомментируйте, я предоставлю. Заранее спасибо.
0 ответов
Вы можете попробовать создать сертификат X509 с помощью приведенного ниже кода.
x509Certificate = новый X509Certificate2(rawData, пароль, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
Это работает для меня после расследования почти 2 дня.