Как предоставить ASP.NET доступ к закрытому ключу в сертификате в хранилище сертификатов?

У меня есть приложение ASP.NET, которое обращается к закрытому ключу в сертификате в хранилище сертификатов. В Windows Server 2003 я смог использовать winhttpcertcfg.exe, чтобы предоставить доступ к секретному ключу в учетной записи NETWORK SERVICE. Как предоставить разрешения для доступа к закрытому ключу в сертификате в хранилище сертификатов (локальный компьютер\личный) на Windows Server 2008 R2 на веб-сайте IIS 7.5?

Я попытался предоставить полный доступ доверия всем "всем", "IIS AppPool\DefaultAppPool", "IIS_IUSRS" и любой другой учетной записи безопасности, которую я смог найти с помощью MMC сертификатов (Server 2008 R2). Однако приведенный ниже код демонстрирует, что код не имеет доступа к закрытому ключу сертификата, который был импортирован с помощью закрытого ключа. Вместо этого код генерирует и генерирует ошибки при каждом доступе к свойствам закрытого ключа.

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";
    }
}

Ответ 1

  • Создать/купить сертификат. Убедитесь, что у него есть закрытый ключ.
  • Импортировать сертификат в учетную запись "Локальный компьютер" . Лучше всего использовать сертификаты MMC. Обязательно установите флажок "Разрешить доступ к закрытому ключу"
  • Исходя из этого, идентификатор пула приложений IIS 7.5 использует одно из следующих.

    • Веб-сайт IIS 7.5 работает под ApplicationPoolIdentity. Открыть MMC = > Добавить сертификаты (локальный компьютер) snap-in = > Сертификаты (локальный компьютер) = > Личные = > Сертификаты = > Щелкните правой кнопкой мыши интересующий сертификат = > Все задачи = > Управление закрытым ключом = > Добавить IIS AppPool\AppPoolName и дайте ему Full control. Замените "AppPoolName" на имя вашего пула приложений (иногда IIS_IUSRS)
    • Веб-сайт IIS 7.5 работает под управлением NETWORK. Используя сертификаты MMC, добавьте "NETWORK SERVICE" для полного доверия к сертификату в "Local Computer\Personal".
    • Веб-сайт IIS 7.5 работает под учетной записью пользователя локального компьютера "MyIISUser". Используя сертификаты MMC, добавьте "MyIISUser" (новую учетную запись пользователя локального компьютера) в Full Trust для сертификата в "Local Computer\Personal".

Обновление на основе комментария @Phil Hale:

Опасайтесь, если вы находитесь в домене, ваш домен будет выбран по умолчанию в поле "from location". Обязательно измените это на "Локальный компьютер" . Измените местоположение на "Локальный компьютер" , чтобы просмотреть идентификаторы пула приложений.

Ответ 2

Примечание о предоставлении разрешений через MMC, Certs, Select Cert, щелкните правой кнопкой мыши, все задачи, "Управление приватными ключами"

Управление приватными ключами осуществляется только в списке меню для личного... Итак, если вы поставили свой сертификат в Trusted People и т.д. вам не повезло.

Мы нашли способ вокруг этого, который сработал для нас. Перетащите сертификат в "Личный", выполните действие "Управление секретными ключами", чтобы предоставить разрешения. Не забудьте установить использование встроенных модулей типа объекта и использовать локальный компьютер, а не домен. Мы предоставили права пользователю DefaultAppPool и оставили его на этом.

Как только вы закончите, перетащите сертификат обратно туда, где вы его первоначально имели. Presto.

Ответ 3

Если вы пытаетесь загрузить сертификат из файла .pfx в IIS, решение может быть столь же простым, как включение этой опции для Application Pool.

Щелкните правой кнопкой мыши пул приложений и выберите " Advanced Settings.

Затем включите Load User Profile


enter image description here

Ответ 4

Я понял, как это сделать в Powershell, о котором кто-то спросил:

$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

Ответ 5

Для меня это было не более чем повторное импортирование сертификата с отметкой "Разрешить закрытый ключ для экспорта".

Я предполагаю, что это необходимо, но это заставляет меня нервничать, поскольку это приложение стороннего производителя, получающее этот сертификат.

Ответ 6

В дополнение к ответам это руководство, чтобы найти закрытый ключ сертификата и добавить разрешения.

Это руководство по поиску FindPrivateKey.exe, найденное в руководстве по поиску закрытого ключа сертификата.