¿Cómo dar acceso a ASP.NET a una clave privada en un certificado en el almacén de certificados?

Tengo una aplicación ASP.NET que accede a la clave privada en un certificado en la tienda de certificados. En Windows Server 2003 pude usar winhttpcertcfg.exe para dar acceso a la clave privada a la cuenta de SERVICIO DE RED. ¿Cómo otorgo permisos para acceder a una clave privada en un certificado en el almacén de certificados (computadora local \ Personal) en un servidor Windows Server 2008 R2 en un sitio web de IIS 7.5?

Intenté dar acceso total a “Todos”, “IIS AppPool \ DefaultAppPool”, “IIS_IUSRS” y todas las demás cuentas de seguridad que pude encontrar utilizando Certificates MMC (Server 2008 R2). Sin embargo, el siguiente código demuestra que el código no tiene acceso a la clave privada de un certificado que se importó con la clave privada. En su lugar, el código arroja un error cada vez que se accede a la propiedad de la clave privada.

Default.aspx

         
Cert Public Key Private Key

Default.aspx.cs

 using System; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Web.UI; public partial class _Default : Page { public X509Certificate2Collection Certificates; protected void Page_Load(object sender, EventArgs e) { // Local Computer\Personal var store = new X509Store(StoreLocation.LocalMachine); // create and open store for read-only access store.Open(OpenFlags.ReadOnly); Certificates = store.Certificates; repeater1.DataSource = Certificates; repeater1.DataBind(); } } public static class Extensions { public static string HasPublicKeyAccess(this X509Certificate2 cert) { try { AsymmetricAlgorithm algorithm = cert.PublicKey.Key; } catch (Exception ex) { return "No"; } return "Yes"; } public static string HasPrivateKeyAccess(this X509Certificate2 cert) { try { string algorithm = cert.PrivateKey.KeyExchangeAlgorithm; } catch (Exception ex) { return "No"; } return "Yes"; } } 

    1. Crear / Comprar certificado. Asegúrate de que tenga una clave privada.
    2. Importe el certificado en la cuenta “Equipo local”. Lo mejor es usar certificados MMC. Asegúrese de marcar “Permitir exportar clave privada”
    3. En base a lo cual, la identidad de IIS 7.5 Application Pool utiliza uno de los siguientes.

      • El sitio web de IIS 7.5 se ejecuta bajo ApplicationPoolIdentity. Abra MMC => Agregar certificado (computadora local) complemento => Certificados (computadora local) => Personal => Certificados => Haga clic derecho en el certificado de interés => Todas las tareas => Administrar clave privada => Agregar IIS AppPool\AppPoolName y otorgarle Full control . Reemplace ” AppPoolName ” con el nombre de su grupo de aplicaciones (a veces IIS_IUSRS )
      • El sitio web de IIS 7.5 se ejecuta bajo SERVICIO DE RED. Usando Certificados MMC, se agregó “SERVICIO DE RED” al Fideicomiso total en el certificado en “Computadora local \ Personal”.
      • El sitio web de IIS 7.5 se ejecuta en la cuenta de usuario de la computadora local “MyIISUser”. Usando Certificados MMC, se agregó “MyIISUser” (una nueva cuenta de usuario de computadora local) a Full Trust on certificate en “Local Computer \ Personal”.

    Actualización basada en el comentario de @Phil Hale:

    Tenga cuidado, si está en un dominio, su dominio se seleccionará de manera predeterminada en el ‘cuadro de ubicación’. Asegúrese de cambiar eso a “Computadora local”. Cambie la ubicación a “Computadora local” para ver las identidades del grupo de aplicaciones.

    Nota sobre la concesión de permisos a través de MMC, Certs, Select Cert, clic con el botón derecho, todas las tareas, “Administrar claves privadas”

    Administrar claves privadas está solo en la lista del menú para Personal … Así que si has puesto tu certificado en Personas de confianza, etc. no tienes suerte.

    Encontramos una forma de evitar esto que funcionó para nosotros. Arrastre y suelte el certificado en Personal, haga lo de Administrar claves privadas para otorgar permisos. Recuerde configurar el uso de complementos de tipo de objeto y usar la máquina local, no el dominio. Le otorgamos derechos al usuario de DefaultAppPool y lo dejamos así.

    Una vez que haya terminado, arrastre y suelte el certificado donde sea que originalmente lo tenía. Prest.

    Descubrí cómo hacer esto en Powershell que alguien me preguntó acerca de:

     $keyname=(((gci cert:\LocalMachine\my | ? {$_.thumbprint -like $thumbprint}).PrivateKey).CspKeyContainerInfo).UniqueKeyContainerName $keypath = $env:ProgramData + “\Microsoft\Crypto\RSA\MachineKeys\” $fullpath=$keypath+$keyname $Acl = Get-Acl $fullpath $Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("IIS AppPool\$iisAppPoolName", "Read", "Allow") $Acl.SetAccessRule($Ar) Set-Acl $fullpath $Acl 

    Si intenta cargar un certificado de un archivo .pfx en IIS, la solución puede ser tan simple como habilitar esta opción para el grupo de Application Pool .

    Haga clic con el botón derecho en el grupo de aplicaciones y seleccione Advanced Settings .

    A continuación, habilite Load User Profile

    enter image description here

    Para mí, no fue más que volver a importar el certificado con “Permitir exportar clave privada” marcada.

    Supongo que es necesario, pero me pone nervioso ya que es una aplicación de terceros que accede a este certificado.