System.Security.Cryptography.CryptographicException: el conjunto de claves no existe

Cuando creo un certificado x509 para cifrar y descifrar mensajes, obtuve información de error y no pude solucionar este problema. ¿Podría alguien resolver este error? Gracias.

Descripción: se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.

Detalles de la excepción:

System.Security.Cryptography.CryptographicException: el conjunto de claves no existe。

Error de fuente:

Línea 53: usando (RSACryptoServiceProvider rsaProviderDecrypt = (RSACryptoServiceProvider)cerDecrypt.PublicKey.Key) Línea 54:
{ Línea 55: plainHashBytes = rsaProviderDecrypt.Decrypt(encryptedHashBytes, false); Línea 56:
rsaProviderDecrypt.Clear(); Línea 57:
rsaProviderDecrypt.Dispose();

Archivo fuente: E:\PayUSite\PayMvcApp\Controllers\HashMessageController.cs Línea: 55

Seguimiento de pila:

[CryptographicException: el conjunto de claves no existe. ]
System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 h) +41
System.Security.Cryptography.RSACryptoServiceProvider.DecryptKey(SafeKeyHandle pKeyContext, Byte[] pbEncryptedKey, Int32 cbEncryptedKey, Boolean fOAEP, ObjectHandleOnStack ohRetDecryptedKey) +0
System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(Byte[] rgb, Boolean fOAEP) +579

código fuente:

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);

preguntado el 24 de agosto de 12 a las 09:08

He visto que esto suceda antes. Busque "El conjunto de claves no existe" en Interoperabilidad Criptográfica: Firmas Digitales. pensar hay un par de manijas abiertas. Cuando se recolectan basura, el recurso compartido se limpia varias veces (lo que no funciona). miraría de cerca certEncrypt.PrivateKey (cifrar generalmente usa claves públicas) y cerDecrypt.PublicKey (el descifrado generalmente usa claves privadas). Creo que se limpian al salir del using cuadra. -

9 Respuestas

Esta pregunta es antigua, pero para alguien que busca la solución mientras continúa usando Encrypt y Decrypt así es como me las arreglo para resolver este error:

La base es que mi certificado se ha instalado de forma incorrecta haciendo doble clic en el .pfx archivo y seleccionando la tienda.

La forma incorrecta de instalar el certificado.

1. Haga doble clic en el certificado:

archivo de certificado

2. Se abre el asistente, haga clic en el siguiente botón:

asistente 0

3. El asistente muestra la ubicación de los certificados, haga clic en el siguiente botón:

asistente 1

4. Ingrese la contraseña y luego haga clic en siguiente:

asistente 2

5. Seleccione la tienda y luego haga clic en siguiente:

asistente 3

6. El asistente muestra la información del certificado, haga clic en Terminar .

asistente 4

7. Se muestra el diálogo de éxito:

asistente 5

Entonces en este punto tuve el error. "El conjunto de claves no existe".


Para solucionar eso procedí de esta manera (la forma correcta)

1. Ejecute Microsoft Management Console (mmc.exe):

ejecutar mmc

2. Una instancia de MMC en blanco mostró:

mmc mostró

3. Haga clic en Archivo->Agregar/Eliminar complemento...

añadir complemento

4. Seleccione el complemento de certificado y haga clic en Añada botón:

agregar complemento de certificado

5. Seleccione Cuenta de computadora luego haga clic en Siguiente botón:

seleccionar cuenta de computadora

6. Seleccione Computadora local luego haga clic en Terminar botón:

seleccione la computadora local

7. El complemento de certificado ahora está agregado, haga clic en OK botón:

muestra el complemento de certificado

8. Seleccione la tienda personal, luego haga clic derecho y seleccione Importa:

seleccionar tienda personal e importar

9. Busque el certificado y haga clic en siguiente:

examinar certificado

10. Ingrese la contraseña, luego haga clic en Siguiente botón:

enter image description here

11. Seleccione automáticamente el almacén de certificados:

seleccionar automáticamente la tienda

12. La información del certificado muestra:

información certificada

13. El mensaje de diálogo de éxito muestra:

enter image description here

14. Actualice la MMConsole para mostrar el certificado:

actualizar mmc

15. Haga clic derecho en el certificado, luego haga clic en Administrar claves privadas...:

gestionar claves privadas

16. Agregue la identidad del grupo o el usuario de IIS en mi caso, agregué IIS_IUSRS:

añadir iis_iusrs

17. El usuario ha sido agregado, haga clic en OK botón:

usuario añadido

Y está terminado, el teclado lo hace. existe ¡¡ahora!!

Respondido el 15 de enero de 14 a las 22:01

Podría haber simplificado mucho su respuesta diciendo "el usuario no tiene permisos para la clave privada, por lo que debe otorgarle permisos". La solución es independiente de cómo importe el certificado (no hay una forma "correcta" o "incorrecta" de importar). ¡Gracias por el último paso en la solución! - Stefann

¡También tuve este problema y establecer los permisos del certificado fue exactamente el problema! Gracias por la excelente respuesta; capturas de pantalla ftw! - felipe pittle

Esto suele ser un problema de permisos. Debe otorgar permisos de lectura a la cuenta de usuario en la que se ejecuta la aplicación o el servicio. - snives

En mi caso, la instalación del certificado desde la consola MMC funcionó. La instalación haciendo doble clic en .PFX no funcionó. - aledpardo

Los elementos de línea 15 y 16 son importantes. - Trabajo en progreso

Recibí el mismo error que OP: "System.Security.Cryptography.CryptographicException: el conjunto de claves no existe"

La resolución (para mí) fue: Visual Studio debe ser (ejecutar como administrador)

Como me explicaron (YMMV), VS debe ejecutarse como administrador para extraer la clave privada de los certificados del almacén de claves, para negociar la autenticación/apretón de manos con keyvault.

respondido 26 mar '18, 21:03

@PalleDue, su aplicación no necesita ejecutarse como administrador, solo debe ejecutarse con una credencial de cuenta de usuario/servicio que haya sido autorizada en el certificado; de lo contrario, es posible que deba volver a pensar en la arquitectura de autenticación de sus aplicaciones. Esta solución también puede funcionar si se autentica en el certificado sin ejecutar VS como administrador, según dónde esté instalado el certificado. - bryan.hunwardsen

Es posible que la aplicación esté intentando escribir en la siguiente ruta de la carpeta: C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys

Si su aplicación utiliza la suplantación de identidad o el usuario IUSR_NOMBRE DE LA MÁQUINA, configure las seguridades de la carpeta MachineKeys y proporcione al usuario Leer y ejecutar, Listar contenido de la carpeta, Leer, Escribir. Si eso no funciona, intente darle al usuario Todos los mismos permisos.

Respondido 24 ago 12, 10:08

Intenté otorgar permiso de escritura al directorio MachineKeys para "todos", pero aún mostraba el mismo mensaje de error. - besley

Tengo entendido que la carpeta MachineKeys a la que se hace referencia anteriormente tiene permisos restringidos por una buena razón: se supone que está bajo el control del sistema operativo. No se supone que puedas acceder a él directamente. - Esteban G Tuggy

Me encontré con el mismo problema. El mensaje no es el ideal y en mi caso mi usuario no tenía permiso para acceder a la clave privada. Puedes arreglar esto usando estos pasos:

  1. Abrir mmc
  2. Agregar complemento de certificado
  3. seleccione el certificado que desea utilizar
  4. haga clic derecho sobre él y seleccione 'Todas las tareas' / 'Administrar claves privadas...'
  5. Agregue su usuario a la lista de usuarios autorizados y permita 'Control total'

respondido 26 nov., 18:17

Intente ejecutar vs como administrador. Trabajó para mi

Respondido 23 ago 19, 07:08

Creo que al usar Cifrar y Descifrar espera una clave pública para cifrar y una clave privada para descifrar. Entonces está fallando porque está tratando de descifrar sin la clave privada y eso causa la excepción.

Realmente deberías estar usando SignData método para crear la firma y Verifique los datos para la verificación.

Respondido 24 ago 12, 11:08

Hay demasiados receptores y es mejor que el remitente proporcione la clave pública (para los receptores) y la clave privada (para sí mismo). - besley

Tiene razón, modifiqué mi código para usar CreateSignature en lugar de cifrar, y eso podría ejecutarse y dar el resultado correcto. Gracias.:-) - besley

Me encontré con este error cuando no estaba cargando la clave privada de mi certificado en la clave de firma de mi SigningKey de XmlElement cuando intentaba firmar una respuesta SAML.

signedElement.SigningKey = myCertificate.PrivateKey;

Respondido el 16 de Septiembre de 16 a las 20:09

En mi caso, la clave privada se almacenó en "C:\ProgramData\Microsoft\Crypto\Keys" y no la carpeta machinekeys: puede verificar usando certutil para averiguar el "Nombre de contenedor único" que será la clave privada.

Ahora escaneo a través del directorio criptográfico para encontrar la coincidencia. Con esa coincidencia, puedo establecer la ACL correcta en el archivo apropiado

Respondido el 30 de Septiembre de 19 a las 18:09

.Net cree un archivo de certificado temporal aquí "..\Microsoft\Crypto\RSA\MachineKeys". Puede ser que el archivo del certificado aún haya bloqueado otro proceso. Intente reiniciar la aplicación y luego la PC. Si el problema se resolvió, debe crear manualmente el archivo .pfx y luego cargar la aplicación de certificado en su PC.

Respondido 31 ago 21, 12:08

Proporcione detalles adicionales en su respuesta. Como está escrito actualmente, es difícil entender su solución. - Comunidad

Si tiene una nueva pregunta, hágala haciendo clic en el Pregunta botón. Incluya un enlace a esta pregunta si ayuda a proporcionar contexto. - emmanuel ponnudurai

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.