c# - X509Certificate-Keyset no existe
wcf (6)
Creo que el problema es que debe agregar la clave al almacén de certificados de la máquina.
Tengo una aplicación WinForms que consume un WCF y pasa como parámetro a una función un certificado:
mySvcClient.SendDocument(cert.Export(X509ContentType.SerializedCert, "password"));
...
En el servicio WCF , recreé el certificado de la matriz de bytes:
public void SendDocument (byte[] binaryCert)
{
X509Certificate2 cert = new X509Certificate2(binaryCert, "password");
...
Pero cuando uso el certificado para firmar un xml, recibí el error "Keyset does not exists":
if (cert.HasPrivateKey) // WORKS!!!
{
signedXml.SigningKey = cert.PrivateKey; // THROW "keyset does not exist" EXCEPTION
...
En mi computadora, ¡la aplicación funciona al 100%! ¡Pero en el WebServer, recibí este error!
La pregunta es: incluso si X509Certificate2 se recrea a partir de una matriz de bytes, ¿necesito algún permiso especial para acceder a la clave privada?
¡Gracias!
Estaba enfrentando el mismo problema, y ​​no sé cómo (lástima de mí), pero funcionó:
var certificate = new X509Certificate2(filePath, password,
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
certificate.PrivateKey; // before: error "KeySet does not exist"!
using (certificate.GetRSAPrivateKey()) { } // pure black magic
certificate.PrivateKey; // after: just works! lol
Espero que Jon Skeet pueda responder a este misterio.
La respuesta de Vano Maisuradze funciona. Si está buscando la herramienta FindPrivateKey, se incluye en Windows Communication Foundation (WCF) y Windows Workflow Foundation (WF) Samples para .NET Framework 4, que se puede encontrar aquí: http://www.microsoft.com/en-us/download/confirmation.aspx?id=21459
Una vez descargado y extraído, abra el proyecto: WF_WCF_Samples / WCF / Setup / FindPrivateKey / CS en Visual Studio y compílelo. A continuación, abra el símbolo del sistema y navegue hasta: WF_WCF_Samples / WCF / Setup / FindPrivateKey / CS / bin
Luego continúa con la respuesta de Vano Maisuradze
Las cuentas de identidad de grupo de aplicaciones no tienen acceso al almacén de certificados de forma predeterminada.
O cambia a la cuenta de Network Services
según lo indicado por Vaibhav. Inspirada o le da acceso al certificado.
Para permitir el acceso, haz el siguiente comando:
WinHttpCertCfg.exe -g -c LOCAL_MACHINE / MY -s "IssuedToName" -a "AccountName"
Notas:
- The tool may need to be installed first. The setup will place the tool at `C:/Program Files (x86)/Windows Resource Kits/Tools/WinHttpCertCfg.exe`.
- `IssuedName` is the issuer property of the certificate that the application will attempt to access
- The command must be run from command prompt with elevated privileges
Referencia: https://support.microsoft.com/en-us/help/901183/how-to-call-a-web-service-by-using-a-client-certificate-for-authentica Paso 2
También debe habilitar la opción Mark this key as exportable
al instalar el certificado.
Me he enfrentado a este problema, mis certificados tenían clave privada pero recibía este error (" Keyset no existe ")
Causa: su sitio web se ejecuta en la cuenta " Servicios de red " o tiene menos privilegios.
Solución: cambie la identidad del grupo de aplicaciones a " Sistema local ", reinicie IIS y vuelva a verificar. Si comienza a funcionar, es un problema de permiso / Menos privilegio, puede suplantar y luego usar otras cuentas también.
Si está utilizando Windows Server 2008 o Windows 7, necesita el permiso para leer la clave privada.
- use la herramienta FindPrivateKey para encontrar la ruta. Por ejemplo:
FindPrivateKey My LocalMachine -n ​​"CN = MyCert" -a
Devuelve la ruta: C: / ProgramData / Microsoft / Crypto / RSA / MachineKeys [File Name]
Vaya a esa ruta y abra las propiedades del archivo
Ir a la pestaña de seguridad
Haga clic en "Editar" y luego "Agregar"
En el diálogo abierto, escriba: IIS AppPool / [nombre de su grupo de aplicaciones] y haga clic en Aceptar
Ahora su grupo de aplicaciones tiene permiso para leer esta clave privada.