firmar - ¿Cómo dar acceso a ASP.NET a una clave privada en un certificado en el almacén de certificados?
firmar xml con certificado digital c# (5)
- Crear / Comprar certificado. Asegúrate de que tenga una clave privada.
- Importe el certificado en la cuenta "Equipo local". Lo mejor es usar certificados MMC. Asegúrese de marcar "Permitir exportar clave privada"
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 otorgarleFull control
. Reemplace " AppPoolName " con el nombre de su grupo de aplicaciones (a vecesIIS_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".
- 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
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.
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
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:Repeater ID="repeater1" runat="server"> <HeaderTemplate> <table> <tr> <td> Cert </td> <td> Public Key </td> <td> Private Key </td> </tr> </HeaderTemplate> <ItemTemplate> <tr> <td> <%#((X509Certificate2)Container.DataItem).GetNameInfo(X509NameType.SimpleName, false) %> </td> <td> <%#((X509Certificate2)Container.DataItem).HasPublicKeyAccess() %> </td> <td> <%#((X509Certificate2)Container.DataItem).HasPrivateKeyAccess() %> </td> </tr> </ItemTemplate> <FooterTemplate> </table></FooterTemplate> </asp:Repeater> </div> </form> </body> </html>
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"; } }
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
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. Presto.
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.