web-dev-qa-db-fra.com

Comment donner l'accès ASP.NET à une clé privée dans un certificat du magasin de certificats?

J'ai une application ASP.NET qui accède à la clé privée dans un certificat du magasin de certificats. Sur Windows Server 2003, j’ai pu utiliser winhttpcertcfg.exe pour accorder un accès par clé privée au compte NETWORK SERVICE. Comment donner des autorisations pour accéder à une clé privée dans un certificat du magasin de certificats (Ordinateur local\Personnel) sur Windows Server 2008 R2 sur 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 trouvés à l'aide des certificats MMC (Server 2008 R2). Toutefois, le code ci-dessous montre que le code n'a pas accès à la clé privée d'un certificat importé avec la clé privée, mais génère une erreur à chaque accès à la propriété de clé privé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";
    }
}
103
thames
  1. Créer/acheter un certificat. Assurez-vous qu'il a une clé privée.
  2. Importez le certificat dans le compte "Ordinateur local". Il vaut mieux utiliser Certificats MMC. Assurez-vous de cocher "Autoriser l'exportation de la clé privée"
  3. En fonction de quoi, IIS 7.5 L’identité du pool d’applications utilise l’un des éléments suivants.

    • Le site Web IIS 7.5 est exécuté sous ApplicationPoolIdentity. Ouvrir MMC => composant logiciel enfichable Ajouter des certificats (ordinateur local) => Certificats (ordinateur local) => Personnel => Certificats => cliquez à droite sur le certificat d’intérêt => Toutes les tâches => Gérer clé privée => Ajouter IIS AppPool\AppPoolName et l'accorde Full control. Remplacez " AppPoolName " par le nom de votre pool d'applications (parfois IIS_IUSRS)
    • Le site Web IIS 7.5 est exécuté sous NETWORK SERVICE. À l'aide de Certificats MMC, ajout de "SERVICE RÉSEAU" à la confiance totale sur le certificat dans "Ordinateur local\Personnel".
    • Le site Web IIS 7.5 s'exécute sous le compte d'utilisateur d'ordinateur local "MyIISUser". À l'aide de Certificats MMC, ajouté "MyIISUser" (un nouveau compte d'utilisateur d'ordinateur local) à une confiance totale pour le certificat dans "Ordinateur local\Personnel".

Mise à jour basée sur le commentaire de @Phil Hale:

Attention, si vous êtes sur un domaine, votre domaine sera sélectionné par défaut dans la zone "depuis l'emplacement". Assurez-vous de changer cela en "Ordinateur local". Changez l'emplacement en "Ordinateur local" pour afficher les identités du pool d'applications.

182
thames

Remarque sur l'octroi d'autorisations via MMC, Certs, Select Cert, clic-droit, tâches multiples, "Gérer les clés privées"

Gérer les clés privées ne figure que dans la liste des menus de 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, effectuez l'opération Gérer les clés privées pour accorder des autorisations. N'oubliez pas de définir l'utilisation des types intégrés d'objet et d'utiliser la machine locale, pas 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 le certificat là où vous l'avez eu à l'origine. Presto.

41
Garrett Goebel

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.

Cliquez avec le bouton droit sur le pool d'applications et sélectionnez Advanced Settings.

Puis activez Load User Profile


enter image description here

11
Simon_Weaver

J'ai compris comment faire cela à Powershell à propos duquel quelqu'un a posé des questions:

$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
7
Ian Robertson

Pour moi, il ne s'agissait que de réimporter le certificat en cochant la case "Autoriser l'exportation de la clé privée".

Je suppose que c'est nécessaire, mais cela me rend nerveux car c'est une application tierce qui accède à ce certificat.

6
Nathan Hartley

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.

0
Juan Lozoya