Mam aplikację ASP.NET, która uzyskuje dostęp do klucza prywatnego w certyfikacie w magazynie certyfikatów. W systemie Windows Server 2003 mogłem użyć winhttpcertcfg.exe do udzielenia dostępu klucza prywatnego do konta NETWORK SERVICE. Jak nadać uprawnienia dostępu do klucza prywatnego w certyfikacie w magazynie certyfikatów (komputer lokalny \ osobisty) w systemie Windows Server 2008 R2 w witrynie sieci Web usług IIS 7.5?
Próbowałem nadać pełne zaufanie dostępom „Wszyscy”, „IIS AppPool \ DefaultAppPool”, „IIS_IUSRS” i wszystkim innym kontom zabezpieczeń, które udało mi się znaleźć przy użyciu programu Certificates MMC (Server 2008 R2). Jednak poniższy kod pokazuje, że kod nie ma dostępu do klucza prywatnego certyfikatu, który został zaimportowany z kluczem prywatnym. Zamiast tego kod generuje błąd za każdym razem, gdy uzyskuje się dostęp do właściwości klucza prywatnego.
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";
}
}
źródło
IIS_IUSRS
dostęp do klucza prywatnego certyfikatuUwaga dotycząca nadawania uprawnień przez MMC, certyfikaty, wybierz certyfikat, kliknij prawym przyciskiem myszy, wszystkie zadania, „Zarządzaj kluczami prywatnymi”
Zarządzaj kluczami prywatnymi znajduje się na liście menu tylko dla osobistych ... Więc jeśli umieściłeś swój certyfikat w Zaufanych ludziach, itp., Nie masz szczęścia.
Znaleźliśmy sposób na obejście tego, który działał dla nas. Przeciągnij i upuść certyfikat na Osobisty, wykonaj polecenie Zarządzaj kluczami prywatnymi, aby przyznać uprawnienia. Pamiętaj, aby ustawić używanie wbudowanych typów obiektów i używać komputera lokalnego, a nie domeny. Przyznaliśmy prawa użytkownikowi DefaultAppPool i tak to zostawiliśmy.
Gdy skończysz, przeciągnij i upuść certyfikat z powrotem tam, gdzie był pierwotnie. Presto.
źródło
winhttpcertcfg
Jeśli próbujesz załadować certyfikat z pliku .pfx w usługach IIS, rozwiązanie może być tak proste, jak włączenie tej opcji dla
Application Pool
.Kliknij prawym przyciskiem myszy pulę aplikacji i wybierz
Advanced Settings
.Następnie włącz
Load User Profile
źródło
Dowiedziałem się, jak to zrobić w Powershell, o które ktoś pytał:
źródło
Dla mnie to nic innego jak ponowne zaimportowanie certyfikatu z zaznaczeniem „Zezwól na eksport klucza prywatnego”.
Myślę, że jest to konieczne, ale denerwuje mnie, ponieważ jest to aplikacja innej firmy uzyskująca dostęp do tego certyfikatu.
źródło
Uzupełnieniem odpowiedzi jest przewodnik po znalezieniu klucza prywatnego certyfikatu i dodaniu uprawnień.
To jest przewodnik dotyczący pobierania FindPrivateKey.exe znajdujący się w przewodniku dotyczącym znajdowania klucza prywatnego certyfikatu.
źródło
Chociaż brałem udział w powyższym, doszedłem do tego punktu po wielu próbach. 1- Jeśli chcesz uzyskać dostęp do certyfikatu ze sklepu, możesz to zrobić jako przykład 2- Znacznie łatwiej i czystiej jest wytworzyć certyfikat i użyć go na ścieżce
Asp.net Core 2.2 OR1:
LUB 2:
źródło
W Panelu Certyfikatów kliknij prawym przyciskiem myszy jakiś certyfikat -> Wszystkie zadania -> Zarządzaj kluczem prywatnym -> Dodaj użytkownika IIS_IUSRS z pełną kontrolą
W moim przypadku nie musiałem instalować swojego certyfikatu z zaznaczoną opcją „Zezwól na eksport klucza prywatnego”, jak wspomniano w innych odpowiedziach.
źródło