Eu tenho um aplicativo ASP.NET que acessa a chave privada em um certificado no armazenamento de certificados. No Windows Server 2003, consegui usar winhttpcertcfg.exe para fornecer acesso de chave privada à conta NETWORK SERVICE. Como concedo permissões para acessar uma chave privada em um certificado no armazenamento de certificados (Computador Local \ Pessoal) em um Windows Server 2008 R2 em um site do IIS 7.5?
Tentei fornecer acesso de confiança total a "Todos", "IIS AppPool \ DefaultAppPool", "IIS_IUSRS" e todas as outras contas de segurança que consegui encontrar usando o MMC de certificados (Server 2008 R2). No entanto, o código a seguir demonstra que o código não tem acesso à Chave Privada de um certificado que foi importado com a chave privada. Em vez disso, o código gera um erro sempre que a propriedade da chave privada é acessada.
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";
}
}
fonte
IIS_IUSRS
acesso à chave privada do certificadoObservação sobre a concessão de permissões via MMC, Certs, Select Cert, clique com o botão direito, todas as tarefas, "Manage Private Keys"
Gerenciar chaves privadas está apenas na lista de menu para Pessoal ... Portanto, se você colocou seu certificado em Pessoas confiáveis, etc., você está sem sorte.
Encontramos uma maneira de contornar isso que funcionou para nós. Arraste e solte o certificado para Pessoal, faça o Gerenciar Chaves Privadas para conceder permissões. Lembre-se de definir o uso de built-ins de tipo de objeto e usar a máquina local, não o domínio. Concedemos direitos ao usuário DefaultAppPool e deixamos por isso mesmo.
Quando terminar, arraste e solte o certificado de volta onde você o tinha originalmente. Presto.
fonte
winhttpcertcfg
Se você estiver tentando carregar um certificado de um arquivo .pfx no IIS, a solução pode ser tão simples quanto habilitar esta opção para o
Application Pool
.Clique com o botão direito no App Pool e selecione
Advanced Settings
.Então habilite
Load User Profile
fonte
Eu descobri como fazer isso no Powershell que alguém perguntou:
fonte
Para mim, não foi nada mais do que reimportar o certificado com a opção "Permitir que a chave privada seja exportada" marcada.
Acho que é necessário, mas fico nervoso, pois é um aplicativo de terceiros acessando este certificado.
fonte
Complementando as respostas, este é um guia para encontrar a chave privada do certificado e adicionar as permissões.
Este é o guia para obter FindPrivateKey.exe encontrado no guia para localizar a chave privada do certificado.
fonte
Embora eu tenha participado do acima, cheguei a este ponto depois de muitas tentativas. 1- Se você deseja acessar o certificado da loja, pode fazer isso como um exemplo 2- É muito mais fácil e mais limpo produzir o certificado e usá-lo por meio de um caminho
Asp.net Core 2.2 OR1:
OU 2:
fonte
No painel de certificados, clique com o botão direito em algum certificado -> Todas as tarefas -> Gerenciar chave privada -> Adicionar usuário IIS_IUSRS com controle total
No meu caso, não precisei instalar meu certificado com a opção "Permitir que chave privada seja exportada" marcada, como falado em outras respostas.
fonte