2010-04-09 7 views
84

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

Я попытался предоставить полный доступ к доверенности «Все», «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"; 
    } 
}

ответ

138
  1. Создание сертификата/Покупка. Убедитесь, что у него есть закрытый ключ.
  2. Импортируйте сертификат в учетную запись «Локальный компьютер». Лучше всего использовать сертификаты MMC. Обязательно установите флажок «Разрешить доступ к закрытому ключу».
  3. На основании которого идентификатор пула приложений IIS 7.5 использует одно из следующих.

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

Update основан на @Phil Hale комментарий:

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

+0

Для меня, ошибки, только в порядке, если пользователь вошел в сервер. http://stackoverflow.com/questions/2774382/iis-6-private-key-certificate-access/2817702#2817702 – Kiquenet

+3

Как настроить («XXX» на полное доверие к сертификату в «Локальном компьютере \ Личном») в Windows Сервер 2008 R2? запустить/mmc/file/добавить оснастку/сертификаты и ??? Спасибо – Cobaia

+6

Когда у вас есть сертификаты MMC, открытые локальному компьютеру \ Личные, нажмите «сертификат», чтобы просмотреть сертификаты. (обратите внимание: следующее предполагает, что сертификат уже импортирован, а затем не импортирует сертификат). Щелкните правой кнопкой мыши сертификат, которому вы хотите предоставить полный контроль. В контекстном меню нажмите «Все задачи», затем в подменю нажмите «Управление приватными ключами». Оттуда вы можете добавить всех пользователей, которым вы хотите «прочитать» доступ к закрытому ключу для сертификата. – thames

5

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

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

+1

Тот же выпуск здесь – jcolebrand

35

Примечание о предоставлении разрешения через MMC, Certs, выберите Cert, щелкните правой кнопкой мыши, все-задачи, «Управление закрытыми ключами»

Управление закрытыми ключами только в списке меню для Personal ... Так что если вы «Положите свой сертификат в« Надежных людей »и т. д. вам не повезло.

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

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

+0

да это хорошо работает. Я упомянул об этом в ответе на следующее сообщение, однако другой ответ был принят, хотя принятый ответ намного длиннее и требует загрузки файла WCF. http://stackoverflow.com/questions/10580326/privatekey-trust-permissions-for-local-machine-trusted-roots-certificates/10594123#10594123 – thames

+2

любое решение для сервера win2003? у него нет управляющих закрытых ключей в качестве опции, например windows 7 – sonjz

+0

Спасибо за это. Он работал для меня в Windows Server 2008 R2. –

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 
4

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

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

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


enter image description here