122 votes

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

J'ai un ASP.NET application qui accède à la clé privée dans un certificat dans le magasin de certificats. Sur Windows Server 2003, j'ai été en mesure d'utiliser winhttpcertcfg.exe pour donner de la clé privée de l'accès à un compte de SERVICE RÉSEAU. Comment puis-je donner des autorisations d'accès à une Clé Privée dans un certificat dans le magasin de certificats (Ordinateur Local\Personnels) sur un Serveur Windows 2008 R2 dans un IIS 7.5 site web?

J'ai essayé de donner l'entière Confiance de l'accès à "tout le monde", "IIS AppPool\DefaultAppPool", "IIS_IUSRS", et everyother compte de sécurité que j'ai pu trouver en utilisant les 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 qui a été importé avec la clé privée. Le code au lieu de projections et d'erreur à chaque fois que la clé privée de la propriété est accessible.

Par défaut.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>

Par défaut.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";
    }
}

211voto

thames Points 1086
  1. Créer et / ou l'Achat de certificats. Assurez-vous qu'il a une clé privée.
  2. Importer le certificat dans le "Ordinateur Local". Mieux utiliser les Certificats de MMC. Assurez-vous de cocher la case "Autoriser l'exportation de la clé privée"
  3. Sur la base de laquelle, les pools d'Applications IIS 7.5 l'identité d'utiliser l'une des opérations suivantes.

    • IIS 7.5 Site web est en cours d'exécution en vertu de l'ApplicationPoolIdentity. Ouvrez la console MMC => Ajouter des Certificats (ordinateur Local) snap-in => Certificats (Ordinateur Local) => Personnel => Certificats => clic Droit sur le certificat d'intérêts => Toutes les tâches => Gérer clé privée => Ajouter un IIS AppPool\AppPoolName et accorder Full control. Remplacer "AppPoolName" avec le nom de votre pool d'applications (parfois, IIS_IUSRS)
    • IIS 7.5 Site web est en cours d'exécution en vertu de SERVICE RÉSEAU. À l'aide de Certificats MMC, a ajouté: "SERVICE RÉSEAU" à la Confiance totale sur le certificat dans "Ordinateur Local\Personnelles".
    • IIS 7.5 Site web est en cours d'exécution en vertu de l' "MyIISUser" de l'ordinateur local de l'utilisateur du compte. À l'aide de Certificats MMC, a ajouté: "MyIISUser" (un nouvel utilisateur de l'ordinateur local compte) à Pleine Confiance sur le certificat dans "Ordinateur Local\Personnelles".

45voto

Garrett Goebel Points 131

Note sur l'octroi d'autorisations via MMC, Certs, Sélectionnez Cert, cliquez-droit, toutes les tâches, "Gérer les Clés Privées"

Gérer les Clés Privées est seulement sur la liste de menus pour les Personnels... Donc, si vous avez mis votre cert de Personnes de Confiance, etc. vous êtes hors de la chance.

Nous avons trouvé un moyen de contourner ce qui a fonctionné pour nous. Faites glisser et déposez le cert Personnels, faire Gérer les Clés Privées chose pour accorder des autorisations. N'oubliez pas de mettre à utiliser des objets de type built-ins et de l'utilisation de la machine locale pas de domaine. Nous avons accordé des droits à la DefaultAppPool de l'utilisateur et à gauche.

Une fois que vous avez terminé, faites glisser et déposez le cert de retour à l'endroit où vous avez initialement. Presto.

7voto

Nathan Hartley Points 1115

Pour moi, il n'était rien de plus que de la re-importer le certificat avec "Autoriser l'exportation de la clé privée" est cochée.

Je suppose que c'est nécessaire, mais il ne me rendent nerveux comme c'est une application tierce accès à ce certificat.

-4voto

gaizkile Points 1

Nous avons une solution à ce problème : IIS 6 certificat avec la Clé Privée de l'accès

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X