System.Security.Cryptography.CryptographicException: набор ключей не существует
Когда я делаю сертификат x509 для сообщения encypt и decypt, я получил некоторую информацию об ошибке и не смог исправить эту проблему. Может ли кто-нибудь когда-нибудь решить эту ошибку? спасибо.
Описание: Необработанное исключение возникло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительной информации об ошибке и ее возникновении в коде.
Сведения об исключении:
System.Security.Cryptography.CryptographicException: набор ключей не существует.
Ошибка источника:
Линия 53: использование (RSACryptoServiceProvider rsaProviderDecrypt = (RSACryptoServiceProvider) cerDecrypt.PublicKey.Key) Строка 54:
{Строка 55: plainHashBytes = rsaProviderDecrypt.Decrypt(encryptedHashBytes, false); Строка 56:
rsaProviderDecrypt.Clear(); Строка 57:
rsaProviderDecrypt.Dispose();
Исходный файл: E:\PayUSite\PayMvcApp\Controllers\HashMessageController.cs Строка: 55
Трассировка стека:
[CryptographicException: набор ключей не существует. ]
System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 ч) +41
System.Security.Cryptography.RSACryptoServiceProvider.DecryptKey(SafeKeyHandle pKeyContext, Byte [] pbEncryptedKey, Int32 cbEncryptedKey, Boolean fOAEP, ObjectHandleOnStack ohRetDecryptedKey) +0
System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(байт [] rgb, Boolean fOAEP) +579
исходный код:
string docFile = Server.MapPath("~/docx/DirectAccess_StepByStep.doc");
HashAlgorithm hash = HashAlgorithm.Create("SHA1");
byte[] hashedBytes;
using (FileStream fs = new FileStream(docFile, FileMode.Open))
{
//compute message hash value
hashedBytes = hash.ComputeHash(fs);
hash.Dispose();
fs.Close();
}
string hashedString = Convert.ToBase64String(hashedBytes);
//encrypt message digest
string priKeyFile = Server.MapPath("~/certificate/WosMiddle.pfx");
X509Certificate2 certEncrypt = new X509Certificate2(priKeyFile, "123456");
byte[] encryptedHashBytes;
using (RSACryptoServiceProvider rsaProviderEncrypt = (RSACryptoServiceProvider)certEncrypt.PrivateKey)
{
encryptedHashBytes = rsaProviderEncrypt.Encrypt(hashedBytes, false);
rsaProviderEncrypt.Dispose();
}
//decrypt message digest
string pubKeyFile = Server.MapPath("~/certificate/WosMiddle-pubkey.cer");
X509Certificate2 cerDecrypt = new X509Certificate2(pubKeyFile);
byte[] plainHashBytes;
using (RSACryptoServiceProvider rsaProviderDecrypt = (RSACryptoServiceProvider)cerDecrypt.PublicKey.Key)
{
//***will throw error message here...***
plainHashBytes = rsaProviderDecrypt.Decrypt(encryptedHashBytes, false);
rsaProviderDecrypt.Dispose();
}
//verify message whether was modified
string docFile2 = Server.MapPath("~/docx/DirectAccess_StepByStep.doc");
HashAlgorithm hash2 = HashAlgorithm.Create("SHA1");
byte[] hashedBytes2;
using (FileStream fs2 = new FileStream(docFile2, FileMode.Open))
{
//compute message hash value
hashedBytes2 = hash.ComputeHash(fs2);
fs2.Close();
}
//compare hash value
bool isEqual = plainHashBytes.SequenceEqual(hashedBytes2);
Ответы
Ответ 1
Этот вопрос старый, но для тех, кто ищет решение, продолжая использовать Encrypt
и Decrypt
, вот как мне удается решить эту ошибку:
База - это мой сертификат, установлен неверный путь, дважды щелкнув файл .pfx
и выбрав хранилище.
Неправильный способ установки сертификата
1. Дважды щелкните сертификат:
![certificate file]()
2. Мастер откроется, нажмите следующую кнопку:
![wizard 0]()
3. Мастер показывает расположение сертификатов, нажмите следующую кнопку:
![wizard 1]()
4. Введите пароль и нажмите "Далее" :
![wizard 2]()
5. Выберите магазин и нажмите "Далее" :
![wizard 3]()
6. Мастер отобразит информацию о сертификате, нажмите кнопку Готово
![wizard 4]()
7. Отображается диалог Succes:
![wizard 5]()
Итак, в этот момент у меня была ошибка "Ключ не существует" .
Чтобы решить это, я продолжил этот путь (правильный путь)
1. Выполните консоль Microsoft Management Console (mmc.exe):
![execute mmc]()
2. Простой экземпляр MMC показал:
![mmc showed]()
3. Нажмите "Файл" → "Добавить/удалить оснастку"...
![add snap-in]()
4. Выберите оснастку сертификата щелчком по кнопке Добавить:
![add certificate snap-in]()
5. Выберите Аккаунт компьютера, затем нажмите кнопку Далее:
<Т411 >
6. Выберите Локальный компьютер, затем нажмите кнопку Готово:
![selecct local computer]()
7. Теперь добавлена оснастка сертификата, нажмите кнопку ОК:
![certificate snap-in shows]()
8. Выберите личный магазин, затем щелкните правой кнопкой мыши и выберите Импорт:
![select personal store and import]()
9. Просмотрите сертификат и нажмите "Далее" :
![browse certificate]()
10. Введите пароль, затем нажмите кнопку Далее:
![enter image description here]()
11. Автоматически выберите хранилище сертификатов:
![automatically select the store]()
12. Информация о сертификате показывает:
![certificate information]()
13. Диалоговое окно "Успешное диалоговое окно" показывает:
![enter image description here]()
14. Обновите MMConsole, чтобы показать сертификат:
![refresh mmc]()
15. Щелкните правой кнопкой мыши по сертификату, затем нажмите Управление приватными ключами...:
![manage private keys]()
16. Добавьте идентификатор пула или пользователь IIS в моем случае, я добавил IIS_IUSRS:
![add iis_iusrs]()
17. Пользователь добавлен, нажмите кнопку ОК:
![user added]()
И он завершен, теперь клавиша существует!
Ответ 2
Приложение может пытаться выполнить запись в следующий путь к папке: C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys
Если ваше приложение использует олицетворение или использует пользователя IUSR_MACHINENAME, настройте учетные записи в папке MachineKeys и дайте пользователю прочитать и выполнить, сохранить содержимое списка, прочитать, записать. Если это не сработает, попробуйте предоставить каждому пользователю те же права.
Ответ 3
Я считаю, что при использовании Encrypt и Decrypt он ожидает открытый ключ для шифрования и закрытый ключ для дешифрования. Таким образом, он терпит неудачу, потому что вы пытаетесь расшифровать без закрытого ключа и что вызывает исключение.
Вы действительно должны использовать
метод SignData для создания подписи и VerifyData для проверки.
Ответ 4
Я столкнулся с той же проблемой. Сообщение не является идеальным, и в моем случае у моего пользователя не было разрешения на доступ к закрытому ключу. Вы можете исправить это, выполнив следующие действия:
- Открыть MMC
- Добавить оснастку сертификата
- выберите сертификат, который вы хотите использовать
- щелкните его правой кнопкой мыши и выберите "Все задачи"/"Управление личными ключами..."
- Добавьте своего пользователя в список авторизованных пользователей и разрешите "Полный доступ"
Ответ 5
Я столкнулся с этой ошибкой, когда я не загружал в PrivateKey из моего сертификата в мой подписанный XML-элемент SigningKey при попытке подписать ответ SAML.
signedElement.SigningKey = myCertificate.PrivateKey;
Ответ 6
Я получил ту же ошибку, что и OP:
"System.Security.Cryptography.CryptographicException: набор ключей не существует"
Решение (для меня) было:
Visual Studio должна быть (запускаться от имени администратора)
Как мне объяснили (YMMV), VS должен быть запущен от имени администратора, чтобы извлечь закрытый ключ сертификатов из хранилища ключей, чтобы согласовать аутентификацию/рукопожатие с keyvault.
Ответ 7
Попробуйте запустить vs от имени администратора. Работал для меня
Ответ 8
В моем случае закрытый ключ был сохранен в "C:\ProgramData\Microsoft\Crypto\Keys"
, а не в папке machinekeys - вы можете проверить с помощью certutil, чтобы узнать "Уникальное имя контейнера", которое будет закрытым ключом.
Сейчас я сканирую крипто-каталог, чтобы найти совпадение. С этим соответствием я могу установить правильный ACL на соответствующий файл