У меня есть приложение 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";
}
}
источник
IIS_IUSRS
Примечание о предоставлении разрешений через MMC, Certs, Select Cert, щелчок правой кнопкой мыши, все задачи, «Управление закрытыми ключами»
Управление закрытыми ключами есть только в списке меню для личных ... Так что, если вы поместили свой сертификат в доверенных лиц и т. Д., Вам не повезло.
Мы нашли способ обойти это, и это сработало для нас. Перетащите сертификат в «Личный», выполните операцию «Управление закрытыми ключами», чтобы предоставить разрешения. Не забудьте настроить использование встроенных функций объектного типа и использовать локальный компьютер, а не домен. Мы предоставили права пользователю DefaultAppPool и на этом оставили.
Когда вы закончите, перетащите сертификат обратно туда, где он был изначально. Presto.
источник
winhttpcertcfg
Если вы пытаетесь загрузить сертификат из файла .pfx в IIS, решение может быть таким же простым, как включение этой опции для
Application Pool
.Щелкните правой кнопкой мыши пул приложений и выберите
Advanced Settings
.Затем включите
Load User Profile
источник
Я понял, как это сделать в Powershell, о котором кто-то спросил:
источник
Для меня это было не что иное, как повторный импорт сертификата с установленным флажком «Разрешить экспорт закрытого ключа».
Думаю, это необходимо, но это заставляет меня нервничать, так как это стороннее приложение, получающее доступ к этому сертификату.
источник
В дополнение к ответам это руководство по поиску закрытого ключа сертификата и добавлению разрешений.
Это руководство по получению FindPrivateKey.exe, которое можно найти в руководстве по поиску закрытого ключа сертификата.
источник
Хотя я присутствовал на вышесказанном, я пришел к этому после многих попыток. 1- Если вам нужен доступ к сертификату из магазина, вы можете сделать это в качестве примера 2- Гораздо проще и чище создать сертификат и использовать его по пути
Asp.net Core 2.2 OR1:
ИЛИ 2:
источник
На панели сертификатов щелкните правой кнопкой мыши сертификат -> Все задачи -> Управление закрытым ключом -> Добавить пользователя IIS_IUSRS с полным контролем
В моем случае мне не нужно было устанавливать сертификат с установленной опцией «Разрешить экспорт закрытого ключа», как сказано в других ответах.
источник