Certificados: No se puede encontrar el certificado y la clave privada para el descifrado de error cuando signo

StackOverflow https://stackoverflow.com/questions/3936065

Pregunta

Trabajo en empresa con muchos servidores y ordenadores para los desarrolladores. Los servidores son Win2003, desarrolladores de PC de Windows XP.

En un preiis01 llamado servidor Win2003, en el entorno de preproducción, otras personas de la empresa instalar un certificado de cliente utilizando cualquier otro usuario (domainCompany \ adminsystems) para iniciar sesión en preiis01 servidor.

admin Cualquier persona que utiliza el usuario "domainCompany \ adminsystems" para acceder en preiis01 servidor (mediante Terminal Server, Escritorio remoto para Windows XP).

el usuario admin es domainCompany \ adminsystems", que instala el certificado.

usuario administrador instalarlo como esto:

Sesión de inicio de sesión como "domainCompany \ adminsystems" Certificado es archivo PFX. No Instalar PFX y utilizando el asistente. La clave privada no comprueba para la exportación. Introduzca la contraseña e instalar.

Hay una aplicación web, que AppPool identidad es:. Cuenta NETWORK SERVICE

servidor Web es IIS 6.0.

en preiis01,

que ejecuta el usuario de administración MMC -> Ajustar en -> Certificados para la máquina local. En el nodo -> Personal -> Certificados, que había visto el certificado de cliente:

Publicado Para ENTIDAD COMPANY INSURE SA - CIF A93 - Nombre apellido1 NAME1

Emitido por FNMT Clase 2 CA

En las propiedades de certificado, la huella digital: "93 bc a4 ad 58 c9 3c af 8b eb 0b 2f 86 c7 9d 81 70 c4 a6 13"

Eso usuario administrador ejecuta este comando:

WinHttpCertCfg.exe LOCAL_MACHINE \ Mi -s "entity company INSURE SA - CIF A93 - Nombre apellido1 NOMBRE1" -g-a "Servicio de red"

El resultado es:

  

certificado correspondiente:

     

CN = ENTIDAD COMPANY ASEGURAR SA - CIF A93 - Nombre apellido1 NAME1

     

OU = 703015476

     

OU = FNMT Clase 2 CA

     

O = FNMT

     

C = ES

     

Concesión de acceso clave privada para   cuenta: NT AUTHORITY \ NETWORK SERVICE

Ahora, admin usuario ejecuta este comando:

WinHttpCertCfg.exe -l -c LOCAL_MACHINE \ Mi -s "entity company INSURE SA - CIF A93 - Nombre apellido1 NOMBRE1"

El resultado es:

  

certificado correspondiente:

     

CN = ENTIDAD COMPANY ASEGURAR SA - CIF A93 - Nombre apellido1 NAME1

     

OU = 700012476

     

OU = FNMT Clase 2 CA

     

O = FNMT

     

C = ES

     

cuentas adicionales y grupos con   el acceso a la clave privada incluye:     domainCompany \ adminsystems NT   AUTORIDAD \ SISTEMA     BUILTIN \ Administradores NT   AUTORIDAD \ SERVICIO DE RED

Ahora, en una página aspx en la aplicación web en el servidor Win2003, IIS 6.0, tengo este código:

Nota:. Valor para X509Certificate2.HasPrivateKeyAccess () es NO (falso) para "ENTIDAD COMPANY INSURE SA - CIF A93 - Nombre apellido1 NAME1" certificado

ASP.NET aplicación ejecuta utilizando la identidad :: NT AUTHORITY \ NETWORK SERVICE

lbInfo.Text += "<br/><br/>ASP.NET application executes using the identity :: <b>" + WindowsIdentity.GetCurrent().Name + "</b><br>";


            var store = new X509Store(StoreLocation.LocalMachine);
            store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
            Certificates = store.Certificates;
            repeater1.DataSource = Certificates;
            repeater1.DataBind();

            var nombreCertificado = "ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1";

            store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
            store.Open(OpenFlags.ReadOnly);

            X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindBySubjectName, nombreCertificado, false);

            if (col.Count > 0)
            {
                X509Certificate2 certificate = col[0];
                store.Close();
                Message.Text = "Certificado " + nombreCertificado + " encontrado en " + StoreLocation.LocalMachine;

                FirmarConCertificado(nombreCertificado, certificate);

            }
            else
            {
                store.Close();
                Message.Text = "El certificado " + nombreCertificado + " no esta instalado en la máquina";
            }


public void FirmarConCertificado(string nombreCertificado, X509Certificate2 certificate)
{
    try
    {
 var mensaje = "Datos de prueba";
                System.Text.Encoding enc = System.Text.Encoding.Default;
                byte[] data = enc.GetBytes(mensaje);

                var contentInfo = new System.Security.Cryptography.Pkcs.ContentInfo(data);
                var signedCms = new System.Security.Cryptography.Pkcs.SignedCms(contentInfo, true);

                var cmsSigner = new System.Security.Cryptography.Pkcs.CmsSigner(certificate);

                //  Sign the CMS/PKCS #7 message
                signedCms.ComputeSignature(cmsSigner);

                //  Encode the CMS/PKCS #7 message
               var ret = Convert.ToBase64String(signedCms.Encode());

 Message.Text += "Firmado con Certificado " + nombreCertificado + " encontrado en " + StoreLocation.LocalMachine;
 }
 catch (Exception ex)
 {
 Message.Text = "Error al firmar con certificado: " + ex.ToString();
 Message.Text += "<br /><br />InnerException: " + ex.InnerException;
 }

}

El código de falla para mí, y me da este error:. No se puede encontrar el certificado y la clave privada para el descifrado

línea de error es: signedCms.ComputeSignature (cmsSigner);

  

Error al sacrificar las exigencias con certificado:   System.Security.Cryptography.CryptographicException:   No se puede encontrar el certificado y   clave privada para el descifrado.

     

AT   System.Security.Cryptography.Pkcs.PkcsUtils.CreateSignerEncodeInfo (CmsSigner   firmante, Boolean silenciosa) en   System.Security.Cryptography.Pkcs.SignedCms.Sign (CmsSigner   firmante, Boolean silenciosa) en   System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature (CmsSigner   firmante, Boolean silenciosa) en   System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature (CmsSigner   firmante) a   ASP.dgsfp_test_testcert_aspx.FirmarConCertificado (String   nombreCertificado, X509Certificate2   certificado) en   c: \ Empresa \ App \ Test \ TestCert.aspx: Línea   242

A continuación, el usuario administrador (recuerdo, que instalar el certificado) realiza esta comandos:

  

Mi FindPrivateKey LocalMachine -t "93   bc a4 ad 58 c9 3c af 8b eb 0b 2f 86 c7   9d 81 70 c4 a6 13" -c

     

FindPrivateKey   Mi LocalMachine -n ??"entity company INSURE SA - CIF A93 - Nombre apellido1 NOMBRE1" -a

     

Mi FindPrivateKey LocalMachine -n   "CN = ENTIDAD COMPANY INSURE SA - CIF A93 - Nombre apellido1 NAME1"   -a

El resultado para los 3 comandos es el mismo:

  

FindPrivateKey ayuda al usuario a encontrar la   ubicación del archivo de clave privada de una   X.50 9 Certificado.

     

Uso: FindPrivateKey [{{-n} | {T}   } [-F | -d | -a]]

     

Nombre del tema de la   certificado

     

huella digital del   certificado (uso Certmgr.exe para obtener   IT)

     

Nombre del archivo de salida -f única

     

-d directorio de salida única

     

file absoluta salida -a   nombrar por ejemplo, Mi FindPrivateKey   CurrentUser -n "CN = John Doe"

     

por ejemplo. -t FindPrivateKey Mi LocalMachine   "03 33 98 63 47 d0 e7 48 71 33 62 64   76 5 c 4c 9d 42 1d 6b 52" -c

FindPrivateKey no reciben nada, pero WinHttpCertCfg.exe -l funciona bien (certificado correspondiente)

Nos han dado privilegios al usuario de servicio de red utilizando la herramienta WinHttpCertCfg.exe, y en el código de ASP.NET (ejecute bajo la cuenta de servicio de red) el certificado se encuentra. Pero falla cuando signo usar el certificado.

Si alguien nos podría dar alguna información sobre, o sugerencias

Actualización:

El usuario en el dominio "domainCompany \ Pre_Certificado" Instalar certificado en el almacén de equipo local.

domainCompany \ Pre_Certificado es administrador, en el grupo IIS_WPG, tiene políticas locales: “Iniciar sesión como servicio“

configuro AppPool identidad en IIS 6.0 para: domainCompany \ Pre_Certificado

ASP.NET aplicación ejecuta utilizando la identidad :: domainCompany \ Pre_Certificado

Reciclo AppPool y ejecutar la aplicación, me sale System.Security.Cryptography.CryptographicException: No se puede encontrar el certificado y la clave privada para el descifrado

Si pongo a prueba una vez más, ingrese en la sesión en el servidor IIS, el uso de usuario domainCompany \ Pre_Certificado, llamo a la página en la aplicación ASP.NET y todo está bien.

(nota: de registro en el servidor de IIS mediante Terminal Server)

Pero si de cierre de sesión de sesión en el servidor IIS (usuario: domainCompany \ Pre_Certificado), me sale el mismo error:

System.Security.Cryptography.CryptographicException: No se puede encontrar el certificado y la clave privada para el descifrado

Cualquier sugerencia ??

¿Fue útil?

Solución

Por favor marque esta documento lo cual ayudará a resolver el problema. Yo recomendaría utilizar opción siguiente comando:

winhttpcertcfg -g -c LOCAL_MACHINE\My -s MyCertificate -a TESTUSER 

Otros consejos

¿Los primeros 2 pasos como el mismo como lo haría con IIS 7.5 (clic aquí)

  1. Crear / certificado de compra. Asegúrese de que tiene una clave privada.
  2. Importar el certificado en la cuenta de "equipo local". Lo mejor es utilizar certificados de MMC. Asegúrese de revisar "Permitir que la clave privada se pueda exportar"
  3. Ejecutar el siguiente comando como administrador. Reemplazar la siguiente:

    • Reemplazar [asunto] con el sujeto y utilice las cotizaciones del certificado si contiene espacios. Creo que también se puede acaba de poner la primera palabra, siempre y cuando no hay otro CERT, que comienza con el mismo tema.
    • Reemplazar [tienda] con el almacén de certificados que ha importado a, por defecto creo que es "ROOT" o "MI" en IIS 6, es decir, "LOCAL_MACHINE \ ROOT" o "LOCAL_MACHINE \ MI"
    • Reemplazar [nombre de equipo] con el nombre del equipo. Usted puede ser capaz de utilizar "\" notación para [computernam] decir "\ Servicio de red" pero yo no lo he probado.

WinHttpCertCfg.exe -g -a "[nombre de equipo] \ Servicio de red" LOCAL_MACHINE -c \ [tienda] -s "[asunto]"

Nota: Si está ejecutando ASP.NET grupo de aplicaciones bajo una identidad distinta de "Servicio de red" que necesita el cambio "Servicio de red" en el comando anterior a la identidad que' re ejecutando el grupo de aplicaciones de IIS.

Puede ser necesario conceder acceso al usuario anónimo también. Si permite el acceso anónimo a continuación, la solicitud se ejecuta como el usuario anónimo no de servicios de red.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top