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 de 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 (equipo local \ personal) en un Windows Server 2008 R2 en un sitio web de IIS 7.5?
Intenté dar acceso de Confianza Total a "Todos", "IIS AppPool \ DefaultAppPool", "IIS_IUSRS" y todas las demás cuentas de seguridad que pude encontrar utilizando Certificados 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 cambio, 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";
}
}
fuente
IIS_IUSRS
acceso a la clave privada del certificadoNota sobre la concesión de permisos a través de MMC, certificados, certificado seleccionado, clic derecho, todas las tareas, "Administrar claves privadas"
Administrar claves privadas está solo en la lista del menú Personal ... Entonces, si ha puesto su certificado en Personas de confianza, etc., no tendrá suerte.
Encontramos una forma de evitar esto que funcionó para nosotros. Arrastre y suelte el certificado a Personal, haga lo de Administrar claves privadas para otorgar permisos. Recuerde configurar el uso de elementos integrados de tipo objeto y usar la máquina local, no el dominio. Otorgamos derechos al usuario DefaultAppPool y lo dejamos así.
Una vez que haya terminado, arrastre y suelte el certificado donde lo tenía originalmente. Presto.
fuente
winhttpcertcfg
Si está intentando cargar un certificado desde un archivo .pfx en IIS, la solución puede ser tan simple como habilitar esta opción para
Application Pool
.Haga clic derecho en el grupo de aplicaciones y seleccione
Advanced Settings
.Entonces habilita
Load User Profile
fuente
Descubrí cómo hacer esto en Powershell sobre lo que alguien preguntó:
fuente
Para mí, no fue más que volver a importar el certificado con la opción "Permitir exportar la clave privada" marcada.
Supongo que es necesario, pero me pone nervioso ya que es una aplicación de terceros que accede a este certificado.
fuente
Complementando las respuestas, esta es una guía para encontrar la clave privada del certificado y agregar los permisos.
Esta es la guía para obtener FindPrivateKey.exe que se encuentra en la guía para encontrar la clave privada del certificado.
fuente
Aunque he asistido a lo anterior, he llegado a este punto después de muchos intentos. 1- Si desea acceder al certificado de la tienda, puede hacerlo como un ejemplo 2- Es mucho más fácil y limpio producir el certificado y usarlo a través de una ruta
Asp.net Core 2.2 OR1:
O 2:
fuente
En el Panel de certificados, haga clic con el botón derecho en algún certificado -> Todas las tareas -> Administrar clave privada -> Agregar usuario IIS_IUSRS con control total
En mi caso, no necesitaba instalar mi certificado con la opción "Permitir exportar la clave privada" marcada, como se dice en otras respuestas.
fuente