System.Security.Cryptography.CryptographicException: el conjunto de claves no existe
Frecuentes
Visto 104,852 veces
59
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);
9 Respuestas
136
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:
2. Se abre el asistente, haga clic en el siguiente botón:
3. El asistente muestra la ubicación de los certificados, haga clic en el siguiente botón:
4. Ingrese la contraseña y luego haga clic en siguiente:
5. Seleccione la tienda y luego haga clic en siguiente:
6. El asistente muestra la información del certificado, haga clic en Terminar .
7. Se muestra el diálogo de éxito:
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):
2. Una instancia de MMC en blanco mostró:
3. Haga clic en Archivo->Agregar/Eliminar complemento...
4. Seleccione el complemento de certificado y haga clic en Añada botón:
5. Seleccione Cuenta de computadora luego haga clic en Siguiente botón:
6. Seleccione Computadora local luego haga clic en Terminar botón:
7. El complemento de certificado ahora está agregado, haga clic en OK botón:
8. Seleccione la tienda personal, luego haga clic derecho y seleccione Importa:
9. Busque el certificado y haga clic en siguiente:
10. Ingrese la contraseña, luego haga clic en Siguiente botón:
11. Seleccione automáticamente el almacén de certificados:
12. La información del certificado muestra:
13. El mensaje de diálogo de éxito muestra:
14. Actualice la MMConsole para mostrar el certificado:
15. Haga clic derecho en el certificado, luego haga clic en Administrar claves privadas...:
16. Agregue la identidad del grupo o el usuario de IIS en mi caso, agregué IIS_IUSRS:
17. El usuario ha sido agregado, haga clic en OK botón:
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
9
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
8
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
8
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:
- Abrir mmc
- Agregar complemento de certificado
- seleccione el certificado que desea utilizar
- haga clic derecho sobre él y seleccione 'Todas las tareas' / 'Administrar claves privadas...'
- Agregue su usuario a la lista de usuarios autorizados y permita 'Control total'
respondido 26 nov., 18:17
7
Intente ejecutar vs como administrador. Trabajó para mi
Respondido 23 ago 19, 07:08
4
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
1
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
0
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
0
.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 c# x509certificate or haz tu propia pregunta.
posible duplicado de CryptographicException 'El conjunto de claves no existe', pero solo a través de WCF - WhiteKnight
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) ycerDecrypt.PublicKey
(el descifrado generalmente usa claves privadas). Creo que se limpian al salir delusing
cuadra. - jww