J'ai une application ASP.NET qui accède à la clé privée dans un certificat dans le magasin de certificats. Sur Windows Server 2003, j'ai pu utiliser winhttpcertcfg.exe pour donner accès par clé privée au compte SERVICE RÉSEAU. Comment accorder des autorisations pour accéder à une clé privée dans un certificat dans le magasin de certificats (ordinateur local \ personnel) sur un Windows Server 2008 R2 dans un site Web IIS 7.5?
J'ai essayé de donner un accès Full Trust à "Tout le monde", "IIS AppPool \ DefaultAppPool", "IIS_IUSRS" et à tous les autres comptes de sécurité que j'ai pu trouver en utilisant les Certificats MMC (Server 2008 R2). Cependant, le code ci-dessous montre que le code n'a pas accès à la clé privée d'un certificat qui a été importé avec la clé privée. Le code génère à la place une erreur à chaque fois que la propriété de clé privée est accédée.
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";
}
}
la source
IIS_IUSRS
accès à la clé privée du certificatRemarque sur l'octroi d'autorisations via MMC, certificats, Select Cert, clic droit, toutes les tâches, "Gérer les clés privées"
Gérer les clés privées est uniquement dans la liste du menu pour Personnel ... Donc, si vous avez mis votre certificat dans Trusted People, etc., vous n'avez pas de chance.
Nous avons trouvé un moyen de contourner cela qui a fonctionné pour nous. Faites glisser et déposez le certificat sur Personnel, faites la chose Gérer les clés privées pour accorder des autorisations. N'oubliez pas de configurer pour utiliser des éléments intégrés de type objet et d'utiliser la machine locale et non le domaine. Nous avons accordé des droits à l'utilisateur DefaultAppPool et nous en sommes restés là.
Une fois que vous avez terminé, faites glisser et déposez le certificat là où vous l'aviez à l'origine. Presto.
la source
winhttpcertcfg
Si vous essayez de charger un certificat à partir d'un fichier .pfx dans IIS, la solution peut être aussi simple que d'activer cette option pour le
Application Pool
.Faites un clic droit sur le pool d'applications et sélectionnez
Advanced Settings
.Puis activez
Load User Profile
la source
J'ai compris comment faire cela dans Powershell que quelqu'un a demandé:
la source
Pour moi, ce n'était rien de plus que de réimporter le certificat avec "Autoriser l'exportation de la clé privée" cochée.
Je suppose que c'est nécessaire, mais cela me rend nerveux car c'est une application tierce qui accède à ce certificat.
la source
Complétant les réponses, ceci est un guide pour trouver la clé privée du certificat et ajouter les autorisations.
Ceci est le guide pour obtenir FindPrivateKey.exe trouvé dans le guide pour trouver la clé privée du certificat.
la source
Bien que j'aie assisté à ce qui précède, j'en suis arrivé à ce point après de nombreuses tentatives. 1- Si vous souhaitez accéder au certificat depuis le magasin, vous pouvez le faire à titre d'exemple 2- Il est beaucoup plus facile et plus propre de produire le certificat et de l'utiliser via un chemin
Asp.net Core 2.2 OR1:
OU 2:
la source
Dans le panneau des certificats, cliquez avec le bouton droit sur un certificat -> Toutes les tâches -> Gérer la clé privée -> Ajouter un utilisateur IIS_IUSRS avec un contrôle total
Dans mon cas, je n'ai pas besoin d'installer mon certificat avec l'option "Autoriser l'exportation de la clé privée" cochée, comme indiqué dans d'autres réponses.
la source