Tengo un código que hace una llamada a un servicio web de terceros que está protegido con la certificación X.509.
Si llamo al código directamente (usando una prueba unitaria) funciona sin ningún problema.
Cuando se implementa, este código se llamará a través de un servicio WCF. He agregado una segunda prueba de unidad que llama al Servicio WCF, sin embargo, esto falla con un CryptographicException
mensaje "Keyset does not exist"
cuando llamo a un método en el servicio web de terceros.
Supongo que esto se debe a que mi servicio WCF intentará llamar al servicio web de terceros utilizando un usuario diferente para mí.
¿Alguien puede arrojar alguna luz adicional sobre este tema?
Esto es muy probable porque el usuario de IIS no tiene acceso a la clave privada para su certificado. Puede configurar esto siguiendo estos pasos ...
fuente
Tuve un problema idéntico anoche. Los permisos en la clave privada se configuraron correctamente, aparentemente todo estaba bien, excepto el error Keyset no existe. Al final resultó que el certificado se importó primero al almacén del usuario actual y luego se trasladó al almacén de máquinas local. Sin embargo, eso no movió la clave privada, que todavía estaba en el
C: \ Documents and settngs \ Administrator ...
en vez de
C: \ Documents and settngs \ Todos los usuarios ...
Aunque los permisos sobre la clave se configuraron correctamente, ASPNET no pudo acceder a ella. Cuando volvimos a importar el certificado para que la clave privada se coloque en la rama Todos los usuarios, el problema desapareció.
fuente
Para resolver el "conjunto de claves no existe" al navegar desde IIS: puede ser por el permiso privado
Para ver y dar el permiso:
Para dar el permiso:
fuente
Tuve el mismo problema al intentar ejecutar la aplicación WCF desde Visual Studio. Lo resolvió ejecutando Visual Studio como administrador.
fuente
Me he enfrentado a este problema, mis certificados tenían clave privada pero recibía este error ( "El conjunto de claves no existe" )
Causa: su sitio web se ejecuta bajo la cuenta "Servicios de red" o tiene menos privilegios.
Solución : cambie la identidad del grupo de aplicaciones a "Sistema local", reinicie IIS y verifique nuevamente. Si comienza a funcionar es un problema de permiso / Menos privilegios, puede suplantar y luego usar otras cuentas también.
fuente
Totalmente frustrante, tuve el mismo problema y probé la mayoría de los anteriores. El certificado exportado correctamente tenía permisos para leer el archivo
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
, pero resulta que no tenía permiso en la carpeta. Lo agregó y funcionófuente
IISAPPPool\www.mywebsite.com
que es el nombre de usuario Windows para mi appool y funcionó :-)Tengo exactamente un problema similar también. He usado el comando
el resultado muestra que la clave privada está en la carpeta c: \ ProgramData en lugar de C: \ Documents and settngs \ All users ..
Cuando elimino la clave de la carpeta c: \ ProgramData, nuevamente ejecuto el comando findPrivatekey no funciona. es decir. No encuentra la llave.
Pero si busco la misma clave devuelta por un comando anterior, aún puedo encontrar la clave en
C: \ Documents and settngs \ Todos los usuarios.
Entonces, según tengo entendido, IIS o el WCF alojado no encuentra la clave privada de C: \ Documents and settngs \ All users ..
fuente
Recibí el error: CryptographicException 'Keyset no existe' cuando ejecuto la aplicación MVC.
La solución fue: dar acceso a los certificados personales a la cuenta con la que se ejecuta el grupo de aplicaciones. En mi caso, fue agregar IIS_IUSRS y elegir la ubicación correcta resolvió este problema.
fuente
La respuesta de Steve Sheldon me solucionó el problema, sin embargo, dado que estoy creando scripts de permisos de certificados sin una interfaz gráfica de usuario, necesitaba una solución con secuencias de comandos. Luché por encontrar dónde estaba almacenada mi clave privada. La clave privada no estaba dentro
-C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
, eventualmente descubrí que realmente estaba dentroC:\ProgramData\Microsoft\Crypto\Keys
. A continuación describo cómo lo descubrí:Lo intenté
FindPrivateKey
pero no pude encontrar la clave privada, y usando powershell el$cert.privatekey.cspkeycontainerinfo.uniquekeycontainername
estaba nulo / vacío.Afortunadamente,
certutil -store my
enumeré el certificado y me dio los detalles que necesitaba para escribir la solución.Luego escaneé
c\ProgramData\Microsoft\Crypto\
la carpeta y encontré el archivo 8787033f8ccb5836115b87acb_ca96c65a-4b42-a145-eee62128a en C: \ ProgramData \ Microsoft \ Crypto \ Keys .Darle a mi cuenta de servicio acceso de lectura a este archivo solucionó los problemas para mí
fuente
Encontré información faltante que me ayudó a obtener mi servicio WCF con seguridad de nivel de mensaje más allá del "conjunto de claves no existe" con el que me encontré a pesar de otorgar permisos a todas las claves generadas a partir de los ejemplos en Internet.
Finalmente importé la clave privada en la tienda de personas de confianza en la máquina local y luego le otorgué a la clave privada los permisos correctos.
Esto llenó los espacios en blanco para mí y finalmente me permitió implementar el servicio WCF con seguridad de nivel de mensaje. Estoy construyendo un WCF que debe cumplir con HIPPA.
fuente
Acabo de reinstalar mi certificado en la máquina local y luego funciona bien
fuente
Si utiliza ApplicationPoolIdentity para su grupo de aplicaciones, puede tener problemas para especificar el permiso para ese usuario "virtual" en el editor de registro (no existe dicho usuario en el sistema).
Por lo tanto, use subinacl : herramienta de línea de comandos que permite establecer ACL de registro, o algo así.
fuente
Solo quería agregar una respuesta de verificación de cordura. Recibía exactamente el mismo error incluso después de instalar los certificados en las tiendas correctas en mis máquinas y tener todos los privilegios de seguridad correctos para el cliente. Resulta que mezclé mi certificado de cliente y mi certificado de servicio. Si ha intentado todo lo anterior, volvería a verificar que tenga esos dos seguidos. Una vez que hice eso, mi aplicación llamó con éxito al servicio web. De nuevo, solo un corrector de cordura.
fuente
Recibió este error al usar el Fedlet de openAM en IIS7
Cambiar la cuenta de usuario para el sitio web predeterminado resolvió el problema. Lo ideal sería que se tratara de una cuenta de servicio. Quizás incluso la cuenta IUSR. Sugiera buscar métodos para el endurecimiento de IIS para clavarlo por completo.
fuente
Llegué a esto en mi proyecto de estructura de servicio después de que el certificado utilizado para autenticar contra nuestra bóveda de claves expiró y se rotó, lo que cambió la huella digital. Recibí este error porque me había perdido la actualización de la huella digital en el archivo applicationManifest.xml en este bloque que hace exactamente lo que otras respuestas han sugerido: a los permisos de SERVICIO DE RED (que todos mis ex ejecutan, configuración estándar para el clúster de tela azul de servicio) acceder a la ubicación de la tienda LOCALMACHINE \ MY cert.
Tenga en cuenta el valor del atributo "X509FindValue".
fuente
Esta es la única solución que me funcionó.
Referencia 1
Referencia 2
fuente
fuente