Как дать ASP.NET доступ к закрытому ключу в сертификате в хранилище сертификатов? - PullRequest
101 голосов
/ 09 апреля 2010

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

Я пытался предоставить Full Trust доступ к «Все», «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" "<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" rel="noreferrer">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>"> <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>

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

Ответы [ 6 ]

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

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

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

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

41 голосов
/ 09 июня 2012

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

Управление личными ключами есть только в списке меню Личные ... Так что если вы поместили свой сертификат в список доверенных и т. Д., То вам не повезло.

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

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

11 голосов
/ 27 ноября 2017

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

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

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

1010 *
*

enter image description here

7 голосов
/ 08 мая 2017

Я понял, как сделать это в 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
6 голосов
/ 10 июня 2011

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

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

0 голосов
/ 17 июня 2019

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

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

...