c# wcf x509certificate

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.

  1. 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]

  1. Vaya a esa ruta y abra las propiedades del archivo

  2. Ir a la pestaña de seguridad

  3. Haga clic en "Editar" y luego "Agregar"

  4. 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.